这是我的代码:
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(输入,缓冲区);现在它工作正常!
答案 0 :(得分:2)
您的realloc
应该strlen(buffer)+1
以容纳字符串末尾的NUL
。
虽然这里没有任何危害,但strncpy
应该将要复制的最大字节数设置为目标缓冲区的大小,而不是源缓冲区的大小。
fflush(stdin)
未定义的行为 - 请参阅fflush(stdin) ANSI C
如果以前realloc
总是input
,为什么还要为NULL
而烦恼?只需使用malloc()
即可。或者更好的只是strdup
缓冲区。
检查fgets
对NULL
的返回值。
答案 1 :(得分:0)
由于终止NULL
,您正在覆盖缓冲区的末尾。您需要分配strlen(buffer) + 1
个字节。此外,由于您已经知道已经分配了足够的空间,因此不需要strncpy()
。
更多想法:realloc()
为此目的很尴尬。首先,它保留了原始缓冲区的内容,这可能意味着不必要的副本。除非字符串长于前一个字符串,否则无需重新分配 - 您可以重用缓冲区。