繁体   English   中英

“计数字符”程序:While 循环不会在 EOF 处终止

[英]"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

图片来自 pg。 《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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM