首页 > 解决方案 > 将直到EOF的行读入C中的指针

问题描述

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

char *str;

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

我想阅读我的代码中的几行并用它们做一些事情。在那个例子中,它只是打印。我想在有 EOF 时结束,然后在 while 循环之后做其他事情。不幸的是,在我使用 CMD-D(Mac/CLion 上的 EOF)的那一刻,整个程序都会终止,不管后面是什么,所以输出中不再有“测试”。

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

标签: cfgetseof

解决方案


在您的代码中,str它只是一个不指向已分配内存的指针。然后你要求fgets()存储str它读取的内容(但是存储在哪里,因为没有分配内存str?!)。这会导致Undefined Behavior,并且必须修复。

一个简单的解决方案是制作str一个字符数组。

您在代码中的EOF内容表明您没有阅读该函数的手册,其中指出:

返回值

如果在尝试读取字符时遇到文件结尾,则设置 eof 指示符 (feof)。如果这发生在可以读取任何字符之前,则返回的指针是空指针(并且 str 的内容保持不变)。

这意味着我们不需要额外的检查。

把所有东西放在一起:

#include <stdio.h>

int main()
{
    char str[50];
    while (fgets(str, 50, stdin)) {
        printf("%s\n", str);
    }
    return 0;
}

它逐行读取文件,然后打印每一行。


有用的链接:从 fgets() 输入中删除尾随换行符


PS:您可以将 50(数组的大小)用作 的第二个参数,但是当指针实际上指向存储内存的另一个位置(例如另一个数组)fgets() sizeof(str)时,这将不起作用。str


推荐阅读