printf返回的结果出乎意料

4
#include<stdio.h>
int main()
{
    printf("He %c llo",65);
}

输出:他 A 你好

#include<stdio.h>
int main()
{
    printf("He %c llo",13);
}

输出结果为:llo。它没有打印出 "He"。
我可以理解,在第一个情况中,65 是 A 的 ASCII 值,因此打印了 A,但是在第二个情况中为什么会打印 llo
谢谢。

这两个例子看起来完全一样。 - caf
第二个参数被编辑为13。 - Sandeep
3
第一个的输出真的只是 A 吗?还是应该是 He A llo - Chris Lutz
3个回答

10

ASCII 13是回车符,在某些系统上,它只是将光标移动到您刚才所在的行的开头。

随后输入的字符会覆盖先前的文本。


5

Man ascii:

Oct   Dec   Hex   Char
015   13    0D    CR  '\r'

字符13是回车符,因此它打印出He,然后返回到行的开头并打印剩余的llo


注意:它返回到当前行的开头而不是下一行的开头,要返回到下一行的开头,您需要使用“\r\n”——回车换行。 - stefanB
stefanB:或者在*NIX和OS X的情况下只需使用\n,或者在OS X之前的MacOS中使用纯粹的\r - Mikael S

3
由于回车符的特性,它的呈现方式会出现一些奇怪的问题。你可以通过将输出内容导入到另一个工具(如xxd)来查看实际字符:
$ gcc b.c && ./a.out | xxd
0000000: 4865 200d 206c 6c6f                      He . llo
$ gcc c.c && ./a.out | xxd
0000000: 4865 2041 206c 6c6f                      He A llo
在打印机、电传打字机和不能显示图形的计算机终端上,回车符被用于不换行地放置字符,以产生字符图形、下划线和删除线等效果。详见维基百科

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接