You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 09:20:07