[英]"Count characters" program: While loop not terminating on EOF
按照 Kernighan 和 Ritchie 的“The C Programming Language”,我正在尝试输入第 18 页描述的程序(见下文)。
我所做的唯一更改是在“main”和“return 0;”之前添加“int”。 在关闭括号之前。
当我在终端 (Mac OS 10.15) 中运行该程序时,系统会提示我输入内容。 输入输入后,系统提示我再次输入 - “printf”行显然从未到达,因此从不显示字符数。
任何人都可以帮我解释为什么永远不会达到 EOF 让 while 循环退出的原因吗? 我阅读了一些建议使用 CTRL + D 或 CTRL + Z 的其他答案,但我认为这不需要额外输入。 (我能够使用 CTRL + D 使循环退出)。
我还在下面粘贴了我的代码和终端 window。
#include <stdio.h>
int main(){
long nc;
nc = 0;
while( getchar() != EOF )
++nc;
printf("%ld\n", nc);
return 0;
}
从页。 C 程序设计语言之18
我的截图
EOF表示文件结束; 换行符不是文件的结尾。 您需要按 CTRL+D 给终端一个 EOF 信号,这就是为什么您永远不会退出 while 循环的原因。
如果您要将文件作为输入而不是通过命令行,那么您就不需要按 CTRL+D
您已经有了正确的答案:在终端输入数据时,Ctrl-D 是向终端驱动程序指示“我完成了”的正确方法,以便它向您的程序发送 EOF 条件(Windows 上的 Ctrl-Z) . Ctrl-C 提前退出您的程序。
如果您使用来自实际文件的重定向运行此程序,它会正确计算文件中的字符数。
除了这两个好的答案之外,我要强调的是, EOF
不会像其他文件那样自然地出现在stdin
中,必须发送来自用户的信号,正如您在问题中已经指出的那样。
想一想,你的输入是一些字符,最后你按下Enter ,所以stdin
中出现的最后一个字符是换行符而不是EOF
。 为了让它工作,必须输入EOF
,这正是 Linux/Mac 的Ctrl + D或 Windows 的Ctrl + Z所做的。
正如@DavidC.Rankin 正确指出的那样, EOF
也可以通过 bash 管道在stdin
上发生,例如echo "count this" |./count
或重定向,例如./count < somefile
,其中somefile
将是一个文本文件,其中包含您要传递的内容到stdin
。
顺便说一下, Ctrl + C只是结束程序,而Ctrl + D结束循环并继续执行程序。
对于来自命令行的单行输入,您可以使用类似的东西:
int c = 0;
while((c = getchar()) != EOF && c != '\n'){
++nc;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.