我知道有关于它的数百个主题,但我需要再次提问。 我有以下代码:
char *str;
while(fgets(&str,50,stdin) != NULL && &str != EOF) {
printf(&str);
}
printf("Test");
我想在我的代码中阅读几行并用它们做些什么。在那个例子中,它只是打印。 我想结束,当有一个EOF然后在while循环后做其他的东西。 不幸的是,在我使用CMD-D(Mac / CLion上的EOF)的那一刻,完整的程序终止了,无论后面是什么,所以没有"测试"在输出处。
有谁知道发生了什么事?还要注意,我需要它作为char指针,因为我想稍后使用它。
答案 0 :(得分:2)
在您的代码中,str
只是一个指向未分配内存的指针。然后你要求fgets()
在str
中存储它所读取的内容(但是在哪里存储它,因为没有为str
分配内存?!)。这会导致未定义的行为,并且必须修复。
一个简单的解决方案是使str
成为一个字符数组。
您的代码中的EOF
表示您没有阅读该函数的手册,该手册指出:
返回值:
如果在尝试时遇到文件结尾 读取一个字符,eof指标设置(feof)。如果发生这种情况 在读取任何字符之前,返回的指针为空 指针(str的内容保持不变)。
这意味着我们不需要额外检查。
把所有东西放在一起:
#include <stdio.h>
int main()
{
char str[50];
while (fgets(str, 50, stdin)) {
printf("%s\n", str);
}
return 0;
}
逐行读取文件,然后打印每一行。
有用的链接:Removing trailing newline character from fgets() input。
PS:您可以使用fgets()
sizeof(str)
的第二个参数,而不是50(数组的大小),但当str
是指针时,这不起作用实际上指向存储内存的另一个位置(例如另一个数组)。
答案 1 :(得分:0)
您的代码应如下所示:
char str[50];
while(fgets(str,sizeof(str),stdin) != NULL) {
printf("%s",str);
}
printf("Test");