C、 为什么printf会添加一个“;D";在一个位数长之后?
我正在阅读K&R C书籍,其中一个示例程序是: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
#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天内接受答案,谢谢提醒。