[英]Reading a string of unknown length from user (works once and stops)
这是我的代码:
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(输入,缓冲区); 现在它工作正常!
你的realloc
应该是strlen(buffer)+1
以容纳字符串末尾的NUL
。
虽然它在这里是无害的,但你的strncpy
应该设置要复制到目标缓冲区大小的最大字节数,而不是源缓冲区的大小。
fflush(stdin)
是未定义的行为 - 请参阅fflush(stdin)ANSI C
如果之前input
始终为NULL
,为什么还要重新realloc
? 只需使用malloc()
。 或者干脆更好strdup
缓冲区。
检查fgets
的返回值是否为NULL
。
由于终止NULL
您正在覆盖缓冲区的末尾。 您需要分配strlen(buffer) + 1
个字节。 因为你已经知道你已经分配了足够的空间,所以不需要strncpy()
。
更多想法: realloc()
为此目的很尴尬。 首先,它保留了原始缓冲区的内容,这可能意味着不必要的副本。 除非字符串比前一个更长,否则无需重新分配 - 您可以重用缓冲区。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.