从用户读取未知长度的字符串(一次工作并停止)

时间:2014-03-06 23:43:06

标签: c string pointers malloc realloc

这是我的代码:

char* get_string()
{
    #define MAX_STRING_LENGTH 1000
    char *input=NULL;
    char  buffer[MAX_STRING_LENGTH];

        fgets(buffer,MAX_STRING_LENGTH,stdin);
        fflush(stdin);
        if((input=realloc(input,strlen(buffer)))==NULL)
        {
            printf("Error allocating memory for string.");
            return NULL;
        }
        strncpy(input,buffer,sizeof(buffer));

    return input;
}

我第一次调用该函数工作正常,第二次它将返回垃圾并且程序存在但有一些错误。

好的,按照我编辑代码的建议:

char* get_string()
{
    #define MAX_STRING_LENGTH 1000
    char *input=NULL;
    char  buffer[MAX_STRING_LENGTH];

        if(fgets(buffer,MAX_STRING_LENGTH,stdin)==NULL)
        {
            printf("Error reading string.");
            return NULL;
        }
        if((input=malloc(strlen(buffer)+1))==NULL)
        {
            printf("Error allocating memory for string.");
            return NULL;
        }
        strncpy(input,buffer,sizeof(input));

    return input;
}

主要是我:

while(1)
{
tmp_arr_ptr=get_string();
printf("%s",tmp_arr_ptr);
}

但是我看到了和以前一样的行为。

UPDATE - 更改为strcpy(输入,缓冲区);现在它工作正常!

2 个答案:

答案 0 :(得分:2)

  1. 您的realloc应该strlen(buffer)+1以容纳字符串末尾的NUL

  2. 虽然这里没有任何危害,但strncpy应该将要复制的最大字节数设置为目标缓冲区的大小,而不是源缓冲区的大小。

  3. fflush(stdin)未定义的行为 - 请参阅fflush(stdin) ANSI C

  4. 如果以前realloc总是input,为什么还要为NULL而烦恼?只需使用malloc()即可。或者更好的只是strdup缓冲区。

  5. 检查fgetsNULL的返回值。

答案 1 :(得分:0)

由于终止NULL,您正在覆盖缓冲区的末尾。您需要分配strlen(buffer) + 1个字节。此外,由于您已经知道已经分配了足够的空间,因此不需要strncpy()

更多想法:realloc()为此目的很尴尬。首先,它保留了原始缓冲区的内容,这可能意味着不必要的副本。除非字符串长于前一个字符串,否则无需重新分配 - 您可以重用缓冲区。