首页 文章

读取行直到EOF成为C中的指针[关闭]

提问于
浏览
-1

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

char *str;

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

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

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

2 回答

  • 0

    您的代码应如下所示:

    char str[50];
    
    while(fgets(str,sizeof(str),stdin) != NULL) {
        printf("%s",str);
    }
    printf("Test");
    
  • 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 是一个实际指向存储器存储的另一个位置的指针时(例如另一个),这将不起作用数组) .

相关问题