阅读k&r(c book)并混淆第1章代码

#include  /* copy input to output; 2nd version*/ main() { int c; while ((c = getchar()) != EOF) putchar(c); } 

这非常令人困惑……因为你永远不会逃脱while循环。 我已经知道EOF是-1。 我输入-1但它只是重新打印它。 这是一个永无止境的循环。 随着时间的推移,图书馆会发生变化,并且与图书的目的不同吗? 当我说库我的意思是库中的putchar()/ getchar()…抱歉。

EOF(文件结尾)如何工作?

EOF只是一个指定负值的宏。 它不必是-1。 您可以使用控制字符从命令行发出文件结束信号,通常是Windows系统的ctrl + z或POSIX系统的ctrl + d的组合。

当你写’-1’时,你不会写VALUE -1,而是字符串{‘ – ‘,’1’}

看看这里 。

EOF不是一个角色

这个很重要。 记住它。

当你试图获得一个角色时,可能会发生一些事情。 通常是有效地阅读一个角色:你的程序接收到这个角色并继续前进……

 int ch = getchar(); 

但是,会发生什么是磁盘崩溃? 或者就在那个时候有一个坏的部门? 或网络瘫痪? 还是没有更多的数据?
那么,必须有一种方法可以将这些条件与普通字符区分开来。 C选择的方式是返回一个永远不能被解释为真实字符的值。 该值为EOF ,这是一个负值(即使您的实现使用signed char for char返回的所有真实字符的值也会转换为unsigned char char )。 这也是为什么对字符使用int 非常重要 (不是预期的char )。

所以EOF意味着不可能阅读一个角色。 您可以尝试找出原因(网络故障?坏扇区?文件末尾?…)或者只是假设它是文件结尾并从那里开始。

所以,在

 while ((c = getchar()) != EOF) 

有两件事:作业和比较

 c = getchar() 

因此,如果出现错误,将在c中为真实字符或EOF设置值0或更多

 while ((c = getchar()) != EOF) 

意思是“虽然没有错误将字符变为变量c

要记住的重要事项:

EOF不是一个角色 。 用int定义字符。

输入文本后,按Enter键以获取新行。 然后按住Ctrl键并按下字母D.

我正在写同一本书。 我认为你应该能够按Ctrl + D退出,但我必须先按Enter键(我认为我的shell有问题)。

顺便说一下,这是在章节文本中。