读取行直到EOF成为C中的指针

时间:2018-05-25 11:14:03

标签: c fgets eof

我知道有关于它的数百个主题,但我需要再次提问。 我有以下代码:

char *str;

while(fgets(&str,50,stdin) != NULL && &str != EOF) {
    printf(&str);
}
printf("Test");

我想在我的代码中阅读几行并用它们做些什么。在那个例子中,它只是打印。 我想结束,当有一个EOF然后在while循环后做其他的东西。 不幸的是,在我使用CMD-D(Mac / CLion上的EOF)的那一刻,完整的程序终止了,无论后面是什么,所以没有"测试"在输出处。

有谁知道发生了什么事?还要注意,我需要它作为char指针,因为我想稍后使用它。

2 个答案:

答案 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");