【问题标题】:Simple program adding "D" to output将“D”添加到输出的简单程序
【发布时间】:2026-02-16 13:05:02
【问题描述】:

我有一个非常简单的程序,它只是将换行符的数量打印为一个整数,然后在每个数字后得到一个“D”。

样本输入:
d [输入]
e [输入]
f [输入]
Ctrl-D [回车]

样本输出:
3D

我做错了什么?

这是 C 编程语言第 2 版第 2 页的逐字记录。 19:

#include <stdio.h>

main()  
{  
    int c, nl;  
    nl = 0;

    while ((c = getchar()) != EOF)  
        if (c == '\n')  
            ++nl;  
    printf("%d\n", nl);  
}

【问题讨论】:

  • 你确定 D 不只是来自 Ctrl+D 吗?
  • 您在哪个平台上运行? MacOS X 有机会吗?
  • 谢谢大家的回答。我正在运行 OpenBSD 4.5。

标签: c printf


【解决方案1】:

我认为 D 来自 Ctrl D。控制台输出 ^D 作为其标准回显逻辑,然后将相应的字符(或者更确切地说这里缺少字符,即 EOF 状态)传递给 getchar(),但是,并且正确地,不发送 cr/lf。然后 C 程序发送它的 3,等等……

在退出前输入超过 9 个 CR 来尝试程序,问题应该“消失”,即不显示。

【讨论】:

  • 我不确定从未见过这样的东西
  • 你似乎是对的。您可以通过在 printf 字符串的开头添加几个额外的换行符来确认这个解释,如下所示: printf("\n\n%d\n", nl); shell 打印 ^D,而 printf 用它的输出覆盖插入符。
  • @RageZ:我以前也没有,但是在 MacOS X (10.5.8) 上的测试显示了这种行为——这让我很惊讶。
【解决方案2】:

将打印行改为:

printf("\n%d\n", nl);

然后你会看到当你按下 ctrl-d 时,你会得到 "^D" 就行了。只是因为您没有按 ctrl-D 后跟 Enter,所以它不在原始程序中的换行符上。并非所有系统都会将 ctrl-d 回显给您,但例如在 OS-X 上会如此。因此,如果您打印一位数字,最终会弄乱输出。你必须解决它。

【讨论】:

  • 你知道是否有一个stty 设置可以控制这个吗?
  • 回答我自己的评论/问题:stty echoctl 启用它,stty -echoctl 禁用它(即,^D 等控制字符的回显)。
【解决方案3】:

无论是输入管道还是手动输入并使用 ^D 结束,这对我来说都适用于 GCC。

$ ./a.out 1 2 3 3 $ echo -ne "1\n2\n3\n" | ./a.out 3

这可能就像@mjv 所说的那样,控制台正在将 D 回显给你 -- 你在 Windows 上,对吗?我认为这对于 Windows 控制台来说是正常的

【讨论】:

  • 马克,在 Windows 上是 ctrl+z 发送 EOF。