C、 为什么printf会添加一个“;D";在一个位数长之后?

C、 为什么printf会添加一个“;D";在一个位数长之后?,c,printf,long-integer,C,Printf,Long Integer,我正在阅读K&R C书籍,其中一个示例程序是: #include <stdio.h> int main() { long nc; nc = 0; while (getchar() != EOF) { ++nc; } printf("%ld", nc); return 0; } #包括 int main(){ 长nc; nc=0; while(getchar()!=EOF){ ++数控; } p

我正在阅读K&R C书籍,其中一个示例程序是:

#include <stdio.h>

int main() {
    long nc;

    nc = 0;
    while (getchar() != EOF) {
        ++nc;
    }
    printf("%ld", nc);

    return 0;
}
#包括
int main(){
长nc;
nc=0;
while(getchar()!=EOF){
++数控;
}
printf(“%ld”,nc);
返回0;
}
当我运行这个程序时,它的行为基本上和我预期的一样。所以对于像
这样的输入,这是一个句子
,它会打印
19

但是,如果我输入10个字符以下的内容(包括EOF),则在输出编号后会附加一个大写字母
D

例如,对于输入
hello
,输出为
6D

为什么在整数值后面附加一个
D
,这是什么意思


注意:
cc
gcc
clang
都会出现这种情况。事实证明,
D
^D
的一部分,当我输入EOF(Unix上的
控件
+
D
)时,它会打印到控制台上。因为在
printf
语句的开头没有
\n
,一个一位数将覆盖
^
,而一个两位数将覆盖整个
^D
,这给人一种奇怪行为的印象。

您使用的是什么版本的gcc?我使用gcc运行了完全相同的代码,并且运行良好。也许这是您的终端在打印文件结尾的Ctrl-D时留下的工件


您的提示是什么?也就是说,如果只删除
printf
,下一行会显示什么?不,输出是6,它不是6D。我明白了,我的错。没有
printf
,下一行有
^D
,因为这就是我输入EOF的方式。如果我将
printf
行更改为
printf(“\n%ld”,nc)
然后数字正确显示在
^D
之后的行上。当输入长度超过
LONG\u MAX
时,此程序将导致UB。这是询问更多细节,而不是澄清问题。与其说是一个好评论,还不如说是一个好评论。(问号和诸如maybe之类的词是我发表评论的原因。)我在macOS上,所以它实际上是12.0.0版的
clang
。命令提示符的行为似乎与macOS终端不同。当我按control键时,我的终端会打印
^D
。单击accept复选标记将问题标记为满意。我只能在2天内接受答案,谢谢提醒。