动态增加字符数组的维度

时间:2015-03-23 13:51:03

标签: 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是一个数值常量,表示可以读取的字符串的最大长度。 哪个是读取没有固定长度的字符串的最佳方法?

3 个答案:

答案 0 :(得分:2)

这为20个字符分配内存。当使用18个字符时,realloc分配另外20个字符。随着字符串的增长,将分配20个字符的附加增量。如果realloc失败,则返回当前字符串。当找到换行符或EOF时,while循环终止 分配的内存应该由调用函数释放 EDIT添加了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;
}

答案 1 :(得分:1)

  

读取没有固定长度的字符串的最佳方法是什么?

正如代码中已经完成的那样,使用malloc()动态分配内存并继续读取字符,直到达到sentinel条件并继续增加使用realloc()在同一指针上分配的内存,除非你有空间抓住所有角色。

Don't cast malloc and family

答案 2 :(得分:0)

calloc() (您已使用)和 realloc() 的组合将用于动态调整缓冲区大小以适应不同长度的用户输入 但是, 现有 示例代码中有几个问题 应该在继续使用该组合之前解决:见下面的建议和评论:

如上所述,您现有的代码将泄漏内存,因为您从未调用free()。 此外,您将在string中获得缓冲区溢出。 (见下面的解释)

这里有几个更正,允许您的示例代码工作:(见评论)

#define LGTH_STRING_INPUT 20

//have written function to accept argument, easier to free memory
char* readStringInp(char *string){

    //char* string=NULL,c=NULL;//done in main
    int c; //getchar() requires int to detect EOF (-1)
    int i=0;

    //string=malloc(LGTH_STRING_INPUT);  //do not cast return value of calloc

    //   max length allow should be LGTH_STRING_INPUT - 1 
    //   to allow room for NULL after loop 
    for(i=0;i<LGTH_STRING_INPUT-1 && ( (c=getchar()) != '\n' && c != EOF );i++)
    {
        string[i]=c;
    }

    string[i]='\0';

    return string;
}

int main(void)
{
    char *buf = {0};
    char bufIn[LGTH_STRING_INPUT];

    //allocated and free memory in calling function:
    buf = malloc(LGTH_STRING_INPUT);
    if(buf)//check return of malloc
    {
        sprintf(bufIn, "%s", readStringInp(buf)); //use return value in buffer
        free (buf);//free memory that has been created
    }
    return 0;
}