当前位置: 首页 > 知识库问答 >
问题:

“计数字符”程序:循环未在EOF终止时

郤玉书
2023-03-14

继Kernighan和Ritchie的C编程语言之后,我试图进入第18页描述的程序(见下文)。

我所做的唯一更改是在关闭括号之前在“main”和“返回0;”之前添加“int”。

当我在终端(Mac OS 10.15)中运行程序时,系统会提示我输入一个输入。输入后,html" target="_blank">系统会提示我再次输入-显然从未到达“printf”行,因此从未显示字符数。

有谁能帮我解释一下为什么当while循环退出时,EOF永远无法达到?我读了一些其他的答案,建议使用CTRL D或CTRL Z,但我认为这不需要额外的输入。(我能够使用CTRL-D使循环退出)。

我还在下面粘贴了我的代码和终端窗口。

#include <stdio.h>
int main(){

    long nc;

    nc = 0;
    while( getchar() != EOF )
        ++nc;

    printf("%ld\n", nc);

    return 0;
}

摘自《C编程语言》第18页

我的截图

共有3个答案

路思源
2023-03-14

除了这两个好答案之外,我要强调的是,EOFstdin中不会像在其他文件中一样自然出现,必须发送来自用户的信号,正如您在问题中所述。

想一想,您的输入是许多字符,最后按Enter键,因此stdin中的最后一个字符是换行字符,而不是EOF。要使其工作,必须输入EOF,而这正是Linux/Mac或Windows所需的。

作为@DavidC。Rankin正确指出了EOF也可以通过bash管道在stdin上发生,例如echo“count this”|/计数或重定向,例如/计数

顺便说一下,CtrlC只是结束程序,而CtrlD结束循环并继续程序执行

对于来自命令行的单行输入,您可以使用以下内容:

int c = 0;

while((c = getchar()) != EOF && c != '\n'){
    ++nc;
} 

魏鸿禧
2023-03-14

EOF意味着文件的结尾;换行符不是文件的结尾。你需要按下CTRL D给终端一个EOF信号,这就是为什么你永远不会退出你的虽然循环。

如果要将文件作为输入而不是通过命令行输入,则无需按CTRL-D键

笪欣嘉
2023-03-14

您已经有了正确的答案:当在终端输入数据时,Ctrl-D是向终端驱动程序指示“我完成了”的正确方式,以便它向您的程序发送EOF条件(Windows上的Ctrl-Z)。Ctrl-C很早就从你的程序中跳出来了。

如果您使用实际文件的重定向运行此程序,它将正确计算文件中的字符数。

 类似资料:
  • 运行这段代码,我希望它增加测试变量5秒,然后完成。 然而,当我运行它时,程序并没有结束(我假设,我已经给了它合理的时间)。然而,如果我将while循环改为 程序在预期的时间内完成(并打印出许多行)。我不明白。为什么会出现这种现象?

  • 我尝试构建一个GUI应用程序,从相机抓取帧并在Tkinter GUI中显示它们。Tkinter mainloop在主线程中执行,而gui的帧抓取和更新在单独的线程中进行。 下面的代码作为一个视频流被抓取并正确显示在我的gui窗口中。但是,当我通过单击“x”来调用on_close()方法来关闭gui时,gui将关闭,但程序不会完全终止。最后一次CLI输出将为“Mainloop stopped!”,但

  • 获取“未终止字符类”错误。 如何修复? 短暂性脑缺血发作 这是我点击运行按钮时的屏幕打印(请注意错误信息):

  • 问题内容: 我有这个代码: 它显然不会编译,因为在匿名类中需要使用final。但是我不能将它定下来,因为事实并非如此。你会怎么做?一种解决方案是复制它,但我认为可能会有更好的方法: 编辑 只是为了清楚起见,为了示例,我在这里使用了Runnable,问题实际上是关于匿名类的,它可以是其他任何东西。 问题答案: 我认为您的解决方案是最简单的方法。 另一种选择是将内部类的创建重构为一个为您完成的工厂函数

  • 我正在尝试编写一个线程,该线程将在我的主程序的后台运行,并监视某些内容。在某个时候,主程序应该向线程发出安全退出的信号。下面是一个以固定间隔将本地时间写入命令行的最小示例。 当“on”变量没有通过引用传递时,此代码会编译并产生预期的结果,只是线程永远不会终止。一旦变量通过引用传递,我就会收到编译器错误 您能建议一种修复此代码的方法吗? 额外的问题:哪里出了问题,为什么它可以与std::ref一起工

  • 程序从另一个类调用一个方法,这有助于更改程序的停止条件。它平均调用该方法3-8次,并且从未达到停止条件,但是它停止了。 示例类如下: 只限于在每个当的条件为false时,use示例类的当循环才会停止。这意味着: 它应该输出它经历了多少个同时循环以及每个循环的值。最终输出a1到e1的相同值。

  • 编辑:修正了缺少的“)”,对不起,这不是问题。是的,我在模式中使用了一个不区分大小写的标志。下面是一些更多的代码: Edit2:stribizhev在下面指出的问题是,我在中读取的字符串实际上是整个ASCII文件。

  • 我有此代码来验证用户输入。条件:输入的值只能是零或正数。不接受负值和字母字符。 这是我的代码,它一直在循环: