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

Rad*_*row 33 c string printf

能帮我理解这个简单代码的输出吗?

const char str[10] = "55\01234";
printf("%s", str);
Run Code Online (Sandbox Code Playgroud)

输出是:

55
34
Run Code Online (Sandbox Code Playgroud)

unw*_*ind 40

\012字符串内的字符序列被解释为八进制转义序列.012解释为八进制的值以10十进制表示,这是\n大多数终端上的换行符()字符.

从维基百科页面:

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

由于您的序列包含三个有效的八进制数字,因此它将被解析.它不会继续使用3from 34,因为这将是第四个数字,只支持三位数.

所以你可以把你的字符串写成"55\n34",这更清楚你所看到的,哪些更便携,因为它不再对新行进行硬编码,而是让编译器生成合适的东西.


mya*_*aut 17

\012是一个表示符号代码的转义序列octal:

012 = 10 = 0xa = LINE FEED (in ASCII)
Run Code Online (Sandbox Code Playgroud)

所以你的字符串看起来像55[LINE FEED]34.

LINE FEED在许多平台上,字符被解释为换行序列.这就是你在终端上看到两个字符串的原因.

  • 我之前从未偶然发现过这个问题,但它是在c99 ISO/IEC:9899中如果你想要它添加:它可以在6.4.4.4字符常数点3和点9给出限制值. (2认同)

dhe*_*ein 6

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

这是ISO/IEC 9899中针对c99所述的标准

对于:

6.4.4.4字符常量

[...]

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

单引号'\'

双引号"\"

问号?\?

反斜杠

八进制字符\八进制数字

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

它受到的范围:

约束

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