gpt4 book ai didi

c - 为什么我需要在我的循环条件中包含 EOF?

转载 作者:太空宇宙 更新时间:2023-11-04 07:56:13 26 4
gpt4 key购买 nike

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

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

添加:

&& ch != EOF 

解决了我的问题。

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

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

谢谢。

最佳答案

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

man getchar

RETURN VALUE

fgetc(), getc() and getchar() return the character read as an unsigned char cast to an int or EOF on end of file or error.

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 .

另请注意,这适用于所有 FILE缓冲区(以读取模式打开),不仅要stdin .

关于c - 为什么我需要在我的循环条件中包含 EOF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49956828/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com