C语言中空终止符后加数字为何出现异常输出?
C语言字符串中
\06转义序列的解析问题 问题场景
当执行以下代码时,程序输出some output,符合预期——因为\0是字符串结束符(空字符),puts遇到它就停止输出:
#include <stdio.h> int main(void) { char x[] = "some output \0 MORE OUTPUT"; puts(x); return 0; }
但将代码修改为以下形式后,程序会输出some output ♠ MORE OUTPUT,\0不再被识别为字符串结束符:
#include <stdio.h> int main(void) { char x[] = "some output \06 MORE OUTPUT"; puts(x); return 0; }
即使直接把\06替换为\6,输出结果也完全一致。
核心原因
这是C语言转义序列语法规则的必然结果:
- 单独的
\0是明确的**空字符(ASCII码值0)**转义表示,是字符串的终止标记,因此puts会在这个位置停止输出。 - 当
\0后紧跟数字时,编译器会将\06整体解析为一个八进制转义序列:这类转义序列以\开头,后跟1-3个八进制数字(0-7),用来表示对应ASCII码值的字符。\06和\6是等价的,都代表八进制数6,转换为十进制是6,对应的ASCII控制字符就是显示为♠的确认符(ACK)。- 这个字符不是空字符,所以
puts不会终止,会继续输出后续的MORE OUTPUT。
补充说明
- 八进制转义序列不需要强制以
0开头,\6、\06、\006都表示同一个字符(ASCII码6)。 - 如果后续数字超出八进制范围(比如
\08),编译器会拆分解析:\0被识别为空字符,8作为普通字符处理,此时puts会在some output后停止输出。
内容的提问来源于stack exchange,提问作者xiushama
相关产品推荐
相关产品推荐

