阅读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有问题)。
顺便说一下,这是在章节文本中。