我一直在阅读Kernighan和Ritchie的C编程语言。很早就我自己遇到了一个无效的程序,即使我直接从书中复制它。以下是说明的屏幕上限 - http://i.imgur.com/SBQSE.png
它陷入无限循环,因为我输入的任何内容显然都是键盘输入,并且它正在检查EOF,这显然不是键盘输入。
#include <stdio.h>
/* copy input to output; 1st version */
main()
{
int c;
c = getchar();
while (c != EOF) {
putchar(c);
c = getchar();
}
}
当然,像这样的关于C的权威书籍不会有错误,我错过了什么吗?
答案 0 :(得分:4)
从命令行读取时,您将运行它并使用ctrl + d
发出EOF信号(文件结束)。
如果你正在从一个文件中读取一个字节流,那么它会自动存在。但是,由于您是从命令行读取的,因此需要使用上面的键序列手动发出文件结束信号。
实际如何运作
EOF通常在(glibc至少)中表示-1,这就是为什么你不能只说while(c) { do work; }
,因为任何非零值都是真的 - 因此EOF是真的,就像任何其他正数字符一样通过致电getchar()
返回。这就是为什么你必须直接检查c是否匹配EOF(-1)与代码c != EOF
,当你用ctrl + d
发送EOF信号时,代码{{1}}出现在流中。
答案 1 :(得分:2)
EOF是文件结尾。尝试Ctrl-D。