【问题标题】:how to use EOF with fgets() in C如何在 C 中将 EOF 与 fgets() 一起使用
【发布时间】:2018-11-14 00:01:09
【问题描述】:

我正在尝试从终端读取输入,如果有空行并按下输入,我想停止读取输入。这是我目前拥有的。

#include <stdio.h>
#include <string.h>

   int main(int argc,char const *argv[]){
       char input[1024];

       while(fgets(input,1024,stdin)!=NULL){
          printf("%s", input);
       }
       if(EOF){
          printf("EOF");
       }

        return 0;
}

【问题讨论】:

  • 您的代码将始终打印"EOF",因为根据标准,EOF 是非零且固定的。检查空行(仅限单个换行符)是微不足道的。 while(fgets(input,1024,stdin)!=NULL &amp;&amp; *input != '\n') ,但这不会解决您在 while 循环之后的问题。
  • 查看fgets 在成功和文件结束时返回的内容。这确实是有据可查的行为。
  • 我想我之前从未见过有人尝试过if(EOF) ...恭喜你在C中找到了新的尝试
  • 程序中不使用命令行参数时,main()的定义合适的形式是int main(void)
  • 您拥有if (EOF) 的地方是有趣的,它可能是适合使用feof() 的少数地方之一:if (feof(stdin)) printf("EOF\n"); else if (ferror(stdin)) printf("ERR\n"); else assert("can't happen" == 0); 是正确的。但请注意:Why is while (!feof(file)) always wrong?

标签: c input stdin fgets


【解决方案1】:

您可以做的一件简单的事情是检查fgets 读入的字符串的长度。输入字符串末尾的换行符被fgets 视为有效字符。这意味着如果您刚刚输入换行符,您正在测试的字符串的长度将为 1 因此,您希望将测试移动到循环内,而不是尝试在循环外测试 EOF。因此,您的代码应如下所示:

#include <stdio.h>
#include <string.h>

int main(void) {
    char input[1024];

    while(fgets(input,1024,stdin)!=NULL) {
        printf("%s", input);
        if(strlen(input) == 1) {
            printf("EOF\n");
            break;
        }
    }
    return 0;
}

另外请注意,要使 EOF 测试正常工作,您不会按 Enter,而是将文件结束键(如 linux 上的 CTRL-D)发送到您的程序。在这种情况下,循环内不会有 strlen 测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 2013-03-07
    • 2016-12-22
    • 2010-11-06
    相关资源
    最近更新 更多