了解包含反斜杠的printf的输出(\ 012)

时间:2015-04-23 09:27:55

标签: c string printf

能帮助我理解这个简单代码的输出:

const char str[10] = "55\01234";
printf("%s", str);

输出结果为:

55
34

3 个答案:

答案 0 :(得分:40)

字符串中的字符序列\012被解释为octal escape sequence。解释为八进制的值012为十进制10,这是大多数终端上的换行符(\n)。

来自维基百科页面:

  

八进制转义序列由\后跟一个,两个或三个八进制数字组成。八进制转义序列在它包含三个八进制数字或者下一个字符不是八进制数字时结束。

由于您的序列包含三个有效的八进制数字,因此它将如何解析。它不会继续使用来自3的{​​{1}},因为这将是第四位数,只支持三位数。

所以你可以把你的字符串写成34,这更清楚你会看到什么,哪个更便携,因为它不再硬编码换行符而是让它编译器生成合适的东西。

答案 1 :(得分:17)

$(window).resize(fontsize);escape sequence,代表 \012 符号代码:

octal

所以你的字符串看起来像012 = 10 = 0xa = LINE FEED (in ASCII)

在许多平台上,

55[LINE FEED]34字符被解释为newline sequence。这就是你在终端上看到两个字符串的原因。

答案 2 :(得分:6)

\012是一个新的换行序列,正如其他人已经说过的那样。 (正如chux绝对正确评论的那样,如果ASCII不是使用的字符集,那么可能会有所不同。但无论如何,这是一个八进制数字。)

这是标准的意思,正如ISO / IEC 9899中的c99所述

有:

  

6.4.4.4字符常量

[...]

  

3单引号,双引号,问号?,反斜杠\,和   任意整数值可根据以下表格表示   序列:

     

单引号'\'

     

双引号“\”

     问号? \?

     

反斜杠\ \

     

八进制字符\八进制数字

     

十六进制字符\ x十六进制数字

它受到的范围:

  

约束

     

9八进制或十六进制转义序列的值应在以下范围内   类型unsigned char表示整数字符常量的值,或   对应于宽字符常量的wchar_t的无符号类型。