【发布时间】:2019-11-21 18:31:07
【问题描述】:
我正在尝试分配长度未知的字符串。我已经制作了这个程序,它工作正常,但是当我尝试 valgrind 时,它总是显示 1 错误“条件跳转或移动取决于未初始化的值” 程序看起来像这样
char *text = NULL;
int i = 0, error = 0;
text = (*char) malloc(sizeof(char));
while(1){
error = scanf("%c", &text[i]);
if(error == EOF)
break;
i++;
text = (*char) realloc(text, sizeof(char) * (i + 1));
}
printf("%s", text);
free(text);
我尝试过使用
scanf("%ms", &text);
但这会停止,当出现换行符时,这是我的任务中的一个问题。 有什么建议吗?
【问题讨论】:
-
(*char)应该是(char*)。但是dont cast malloc -
您展示的代码有一个主要问题:您忘记了字符串需要以空值终止。您需要分配一个额外的字符,在打印字符串之前,您需要将其初始化为
'\0'。 -
另外,请花一些时间阅读how to ask good questions 和this question checklist。并学习如何创建minimal reproducible example 向我们展示。您向我们展示“类似”您拥有的代码是不够的,最好向我们展示一个正确的示例,它可以复制您所询问的问题,并且不包含任何其他不相关的错误。
-
这种“尝试将字符串塞入缓冲区,如果不起作用,将长度增加一个并重试”的方法确实效率低下。尝试将缓冲区的大小增加一倍,或者每轮增加 1.5 倍。
-
关于换行符,您显示的代码不应在换行符处停止。它会从标准输入读取输入,直到您实际输入“文件结尾”(例如,在 Linux 或 macOS 等 POSIX 系统上为
Ctrl-D,在 Windows 上为空行上的Ctrl-Z)。
标签: c