【问题标题】:Why do I need to include EOF in my loop condition?为什么我需要在循环条件中包含 EOF?
【发布时间】:2018-04-21 14:33:34
【问题描述】:

我的任务是编写一个程序,该程序将接受键盘输入(不包括空格)并在不使用数组的情况下打印到 .txt 文件。

我尝试使用 while 循环来执行此操作,但遇到了无限循环,然后我开始堆栈溢出,并在另一个问题 EUREKA 中找到了解决方案!

添加:

&& ch != EOF 

解决了我的问题。

但是,我不完全理解为什么该解决方案有效,并且希望帮助理解为什么需要第二个条件。

while((ch=getchar()) != '\n' && ch != EOF)
   {
       putc(ch, fin);
   }
   fclose(fin);
   return 0;

谢谢。

【问题讨论】:

  • 如果getchar 到达文件末尾,它将永远不会返回'\n'。所以你需要另一个理由来退出循环。
  • 那么getchar是一个包含用户输入的文件吗?
  • 不,getchar() 是一个从标准输入读取的函数。
  • 我的困惑是不明白 'getchar()' 是从哪里读取的,这有助于我理解。谢谢。

标签: c while-loop eof getchar


【解决方案1】:

因为getchar的返回值是成功时读取的字符,并且 EOF 出错或到达文件末尾时:

man getchar

返回值

fgetc()getc()getchar() 将读取的字符作为 unsigned char 强制转换为 intEOF 在文件结尾或错误时返回。

stdin 可能到达文件末尾有几个原因:

  • 用户按下 Ctrl+D(在 Unix/Linux 上)导致 stdin关闭
  • stdin 已连接到管道 ($ cat file.txt | ./myprogram) 并且管道 已关闭,因为 cat 已结束。
  • stdin 已连接到重定向 ($ ./myprogram < file.txt) 并且它 到了file.txt的结尾

在所有这些情况下,getchar 最终将返回 EOF,您无法保留 阅读。如果你这样做了

while((ch=getchar()) != '\n')
{
    ...
}

然后stdin 关闭,然后你会陷入无限循环,也就是EOF != '\n' 总是 评估为真。所以为了保护自己,你必须检查 如果读取操作失败。你可以通过检查读数是否 函数返回EOF。这就是为什么

int ch;
while((ch=getchar()) != '\n' && ch != EOF)
{
    ...
}

是使用getchar 循环的正确方式。另请注意,ch 必须是 输入int

还请注意,这适用于 all FILE 缓冲区(以读取模式打开), 不仅仅是stdin

【讨论】:

  • 感谢您花时间解释,这让事情变得更清楚了。
  • @8TrackRobot getchar 的手册页解释了所有这些。在用 C 编码时理解问题时,它应该是第一行参考。
猜你喜欢
  • 1970-01-01
  • 2018-10-09
  • 2021-05-29
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多