繁体   English   中英

为什么单个数字会附加“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附加到 output 而不是第一种情况(即使c应该保持相同的值)?

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

无论出于何种原因,您的代码根本无法 output 为“D”。 除非确实发生了一些不确定的事情,例如编译器或 glibc 中的错误。 或者可能是 memory 中的位翻转。

“D”很可能是由于您使用的终端,但您的代码根本不能 output 它。

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

在发布问题时,我认为这种行为与这种情况有关,但事实证明,它与代码无关,只是终端行为
一些程序员老兄在评论中的建议是完全正确的:终端只是输出程序的^D和 output 然后覆盖^ ,但不是D ,因此对于个位数的数字 output 最终会附加D
两个(或更多)数字只会覆盖整个^D

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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