c - 动态增加字符数组的维数

标签 c string input

我在 C 语言中有这个函数,我在我的项目中使用它来读取输入中的字符:

char* readStringInp()
{
    char* string=NULL,c=NULL;
    int i=0;

    string=(char *)malloc(sizeof(char)*LGTH_STRING_INPUT);

    for(i=0;i<LGTH_STRING_INPUT && ( (c=getchar()) != '\n' && c != EOF );i++)
        string[i]=c;

    string[i]='\0';

    return string;
}

LGTH_STRING_INPUT 是一个数字常量,表示可以读取的字符串的最大长度。 读取不固定长度的字符串的最佳方法是什么?

最佳答案

这会为 20 个字符分配内存。当使用了 18 个字符时,另外 20 个字符由 realloc 分配。随着字符串的增长,将分配 20 个字符的额外增量。如果 realloc 失败,则返回当前字符串。当找到换行符或 EOF 时,while 循环终止。
分配的内存应该由调用函数释放。
编辑添加 main() 以显示已分配内存的释放

#include <stdio.h>
#include <stdlib.h>

char* readStringInp();

int main()
{
    char *s=readStringInp();
    if ( s != NULL)
    {
        printf ( "%s\n", s);
        free ( s);
    }
    return 0;
}

char* readStringInp()
{
    char* string=NULL, *temp = NULL;
    int c=0, available=20, used=0, increment=20;

    string=malloc(available);
    if ( string == NULL)
    {
        printf ( "malloc failed\n");
        return NULL;
    }

    while( (c=getchar()) != '\n' && c != EOF )
    {
        if ( used == available - 2)
        {
             available += increment;
             temp = realloc ( string, available);
             if ( temp == NULL)
             {
                 printf ( "realloc failed\n");
                 return string;
             }
             string = temp;
        }
        string[used]=c;
        used++;
        string[used]='\0';
    }
    return string;
}

关于c - 动态增加字符数组的维数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29211985/

相关文章:

c - 导航基本二叉树

python - 在 Python 中反转字符串的 "group"

c - 我在使用字符串通过引用传递时遇到问题

batch-file - 如何使用管道解码我的 tiff 图片以输入 tensorflow?

javascript - 单击按钮后如何清除 VueJS 中的输入文本?

C 编程 - 单链表中的插入排序

c - 让 fftw.h 在 C 中工作

c - 用 C 语言编写字数统计程序

c - 如何在循环中使用 sscanf?

Android 多点触控 : ACTION_UP not always called?