能帮助我理解这个简单代码的输出:
const char str[10] = "55\01234";
printf("%s", str);
输出结果为:
55
34
答案 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的无符号类型。