【问题标题】:Why do I need to press CTRL+D twice to break out of `while ((c=getchar())!=EOF)` in Ubuntu 14.10?为什么我需要按 CTRL+D 两次才能在 Ubuntu 14.10 中跳出 `while ((c=getchar())!=EOF)`?
【发布时间】:2015-07-20 04:08:41
【问题描述】:

我是 C 编程和 Ubuntu 的新手。我正在阅读 D.M Ritchie 的“The C Programming Language”,在那里我找到了以下代码:

#include <stdio.h>

int main()
{
    int c;
    int nc=0;
    while((c = getchar()) != EOF)
    {
        nc++;
    }

    printf("%d Characters \n",nc);

    return 0;
}

但在运行程序时,我输入“Hello”,然后 CTRL+D 两次 得到实际的字符数,即 5。

但是当我输入“Hello”然后CTRL+D 一次,什么都没有发生,终端仍然等待输入。

为什么?

【问题讨论】:

  • 如果没有任何数据要刷新到stdin,我认为CTRL+D会发送EOF
  • @CoolGuy 我点击了上面的链接,发现 Veritas 的评论很有帮助。谢谢你的帮助。但是如果我在“Hello”之后按“ENTER”然后按 CTRL+D 一次,字符数变为 6。我认为除了“Hello”之外,“\n”是一个额外的字符。不是吗?
  • 是的。这是正确的。请记住EOF != '\n'。所以当你按下回车键时循环不会中断。
  • 我现在尝试了以下代码 .... #include int main() { char c; c=getchar(); while (c!= EOF) { putchar(c); c=getchar(); } 返回 0;上面的代码将输入显示为输出......在这里,当我按下“ENTER”时,循环会在按预期显示输出后中断。当 EOF!= "\n" 这是怎么回事?在这里我根本不用按CTRL+D!!

标签: c ubuntu terminal eof getchar


【解决方案1】:

引用@Veritas's comment

在 linux 上,Ctrl-D 仅在缓冲区已经为空时才起作用,否则它只会刷新它。因此,除非他在没有任何字符的情况下按下回车,否则他将不得不按两次 Ctrl-D。

这解释了这个问题。您必须按两次,因为在输入Hello 后,您没有按Enter 将输入刷新到stdin。所以当你第一次按下 CTRL+D 时,它会将数据刷新到stdin。第二次按下,发送EOF

【讨论】:

    猜你喜欢
    • 2016-01-08
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 2018-06-29
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多