为什么单个数字附加 "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
的值(据我所知) 应该与第一种情况完全相同。
所有单个数字(即 1D
、2D
、3D
... 9D
)的情况相同,从 10
开始附加 D
不再可见。
我想知道:
为什么 D
在第二种情况下附加到输出,而不是在第一种情况下(即使 c
应该保持相同的值)?
是否可以避免此 D
附加(以及如何,如果是的话)?
无论出于何种原因,您的代码都无法输出“D”。除非真的发生了一些问题,比如编译器或 glibc 中的错误。或者可能是内存中的位翻转。
“D”很可能是由于您使用的终端,但您的代码根本无法输出它。
嗯,机会很小。如果您读取超过 INT_MAX
个字符,则有符号整数 c
将溢出,从而调用未定义的行为。这不太可能输出“D”,但有可能。
发布问题时,我认为此行为与 this 等案例有关,但事实证明,它与代码无关,只是 终端行为。
Some programmer dude 在评论中的建议是完全正确的:终端简单地输出 ^D
并且程序的输出然后覆盖 ^
,而不是 D
,因此对于单个数字,输出最终会附加 D
。
两个(或更多)数字简单地覆盖整个^D
。
我可以通过将 EOF
触发序列更改为 Ctrl+L(通过 stty eof ^L
),则输出变为1L
、2L
、3L
... 9L
。
正如 Jonathan Leffler 在上面的评论中所说,禁用控制字符的回显(stty -echoctl
)将解决问题。
为什么单数数字后跟“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
的值(据我所知) 应该与第一种情况完全相同。
所有单个数字(即 1D
、2D
、3D
... 9D
)的情况相同,从 10
开始附加 D
不再可见。
我想知道:
为什么
D
在第二种情况下附加到输出,而不是在第一种情况下(即使c
应该保持相同的值)?是否可以避免此
D
附加(以及如何,如果是的话)?
无论出于何种原因,您的代码都无法输出“D”。除非真的发生了一些问题,比如编译器或 glibc 中的错误。或者可能是内存中的位翻转。
“D”很可能是由于您使用的终端,但您的代码根本无法输出它。
嗯,机会很小。如果您读取超过 INT_MAX
个字符,则有符号整数 c
将溢出,从而调用未定义的行为。这不太可能输出“D”,但有可能。
发布问题时,我认为此行为与 this 等案例有关,但事实证明,它与代码无关,只是 终端行为。
Some programmer dude 在评论中的建议是完全正确的:终端简单地输出 ^D
并且程序的输出然后覆盖 ^
,而不是 D
,因此对于单个数字,输出最终会附加 D
。
两个(或更多)数字简单地覆盖整个^D
。
我可以通过将 EOF
触发序列更改为 Ctrl+L(通过 stty eof ^L
),则输出变为1L
、2L
、3L
... 9L
。
正如 Jonathan Leffler 在上面的评论中所说,禁用控制字符的回显(stty -echoctl
)将解决问题。