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

C 理解包含反斜杠(\012)的printf的输出,c,string,printf,C,String,Printf,你能帮我理解这个简单代码的输出吗: const char str[10] = "55\01234"; printf("%s", str); 输出为: 55 34 字符串中的字符序列\012被解释为。解释为八进制的值012是十进制的10,这是大多数终端上的换行符(\n) 从维基百科页面: 八进制转义序列由\后跟一个、两个或三个八进制数字组成。当八进制转义序列已经包含三个八进制数字,或者下一个字符不是八进制数字时,八进制转义序列结束 由于您的序列包含三个有效的八进制数字,因此将对其进行解析。它不

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

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

55
34

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

从维基百科页面:

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

由于您的序列包含三个有效的八进制数字,因此将对其进行解析。它不会继续使用
34
中的
3
,因为这将是第四个数字,并且只支持三个数字

因此,您可以将字符串编写为
“55\n34”
,这更清楚地显示了您所看到的内容,并且更便于移植,因为它不再硬编码换行符,而是让编译器生成合适的内容。

\012
是一个表示
八进制
符号代码:

012 = 10 = 0xa = LINE FEED (in ASCII)
因此,您的字符串看起来像
55[linefeed]34


换行符
字符被解释为在许多平台上。这就是为什么在终端上会看到两个字符串

\012
是一个新的换行序列,其他人已经说过了。 (正如chux absolute correct所评论的,如果ASCII不是使用的字符集,那么可能会有所不同。但无论如何,在这种表示法中,它是一个八进制数字。)

这是指ISO/IEC 9899中c99的标准

用于:

6.4.4.4字符常数

[……]

3单引号、双引号、问号、反斜杠和 任意整数值可根据下表表示 顺序:

单引号'\'

双引号“\”

问号?\

反斜杠\\

八进制字符\八进制数字

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

以及它绑定到的范围:

约束条件

9八进制或十六进制转义序列的值应在 整型字符常量的无符号字符类型的可表示值,或 与宽字符常量的wchar\u t对应的无符号类型


在哪种规范下给出的?我以前从未在这方面遇到过问题,但如果你想添加它,它在c99 ISO/IEC:9899中:可以在6.4.4字符常量下找到。第3点和第9点对值进行了限制。@Zaibis:谢谢你的注释。我不确定引用标准会让我的答案对OP更清楚。我更愿意引用ep wikipedia链接。@Medionic:这是我在wiki上所说的不正确的地方。第9点说明(正如你在我的回答中所看到的)转义序列被限制为适合无符号字符范围的值。十六进制限制为
\xFF
和八进制:
\377
@Medionic:八进制序列根据语法可以有1、2或3位数字:只想知道为什么有人否决了它^^^^^还值得注意的是,这是因为您提供了一个用双引号字符串表示它是这样解释的。因为如果一次只添加一个字符,则必须在
'\\\'、'0'、'1'、'2'
'\0'、'1'、'2'
'\012'
之间进行选择(这也恰好改变了字符表的大小)这是一个关于C的有趣的小事实,但并不广为人知。同样,如果你写一个以
0
开头的整数,它会被自动解释为八进制。
inti=012;
inti=10;
printf(“%d\n”,012)相同
输出
10
.SSDD:the@hobbs从我所能看到的,很少有C编程课程谈论一般的八进制…老实说,它并不太有用,为什么有人想写
012
而不是
10
\012
而不是
\n
?我知道你可能会从在这里它很有用,但一般来说?你能补充一下为什么它以12作为八进制数,而不是1或123吗?@Zaibis What?页面还说“注意,一些三位八进制转义序列可能太大,无法容纳一个字符;这将为实际生成的字符生成一个实现定义的值。“这可能与
\777
有关,如果这是您所说的(777八进制为511十进制,超出了8位字符编码的范围)。”
\012
是一个新的换行序列“使用ASCII时是正确的,因此其99.9%的时间正确,但这不符合C规范。@chux:我完全同意,很抱歉我的错误,我会尽快找到时间进行编辑。