为什么单个数字附加 "D" (在 C 输出中)?

Why single digit numbers are appended with "D" (in C output)?

为什么单数数字后跟“D”(在 C 输出中)?

以下代码

#include <stdio.h>

int main(void)
{
    int c = 0;

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

    return 0;
}

一旦编译 & 运行,输出 0,如我所料。
不过,这段代码

#include <stdio.h>

int main(void)
{
    int c = 0;

    while (getchar() != EOF) {
        ++c;
    }

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

    return 0;
}

一旦编译 & 运行,在立即触发 EOF 后——出于某种原因输出 0D,尽管 c 的值(据我所知) 应该与第一种情况完全相同。
所有单个数字(即 1D2D3D ... 9D)的情况相同,从 10 开始附加 D 不再可见。

我想知道:

  1. 为什么 D 在第二种情况下附加到输出,而不是在第一种情况下(即使 c 应该保持相同的值)?

  2. 是否可以避免此 D 附加(以及如何,如果是的话)?

无论出于何种原因,您的代码都无法输出“D”。除非真的发生了一些问题,比如编译器或 glibc 中的错误。或者可能是内存中的位翻转。

“D”很可能是由于您使用的终端,但您的代码根本无法输出它。

嗯,机会很小。如果您读取超过 INT_MAX 个字符,则有符号整数 c 将溢出,从而调用未定义的行为。这不太可能输出“D”,但有可能。

发布问题时,我认为此行为与 this 等案例有关,但事实证明,它与代码无关,只是 终端行为
Some programmer dude 在评论中的建议是完全正确的:终端简单地输出 ^D 并且程序的输出然后覆盖 ^,而不是 D,因此对于单个数字,输出最终会附加 D
两个(或更多)数字简单地覆盖整个^D

我可以通过将 EOF 触发序列更改为 Ctrl+L(通过 stty eof ^L),则输出变为1L2L3L ... 9L
正如 Jonathan Leffler 在上面的评论中所说,禁用控制字符的回显(stty -echoctl)将解决问题。