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

C语言中用printf(%s)输出char数组出现异常字符的原因探究

为什么C语言代码输出的字符串末尾会出现问号?

嘿,这个问题其实是C语言字符串处理里的经典“踩坑点”——C语言中的字符串必须以空字符'\0'(ASCII值为0)结尾,咱们来拆解清楚:

第一个代码的问题根源

你写的这段代码:

int main() {
    char btext[20];
    for(int i=0; i< sizeof(btext); i++) {
        btext[i]= 'x' ;
    }
    for(int i=0; i< sizeof(btext); i++) {
        printf("%c", btext[i]);
    }
    printf("\nbtext: %s\n", btext);
    return 0;
}
  • 你把btext数组的20个位置全填成了'x',完全没给'\0'留位置。
  • 而printf("%s")的输出规则是:从数组起始地址开始逐个读取字符,直到碰到'\0'才停止输出。
  • 因为你的btext里没有这个终止符,printf就会“越界”去读数组后面的内存内容,直到在某个随机内存地址里找到'\0'。那个末尾的问号,就是它读到的随机内存数据对应的字符——换个机器或者重新运行,可能会变成其他乱码,本质都是随机的内存垃圾。

怎么修复这个问题?

有两种简单的办法:

  • 方法一:预留终止符位置
    循环只填充前19个字符,最后一个位置手动设为'\0':
    for(int i=0; i< sizeof(btext)-1; i++) {
        btext[i]= 'x' ;
    }
    btext[sizeof(btext)-1] = '\0'; // 手动添加字符串终止符
    
  • 方法二:初始化时自动填充终止符
    定义数组的时候直接初始化为全0,这样所有元素默认是'\0',你只需要填充前19个'x'即可:
    char btext[20] = {0}; // 所有元素初始化为0(即'\0')
    for(int i=0; i< sizeof(btext)-1; i++) {
        btext[i]= 'x' ;
    }
    

第二个代码的类似问题

你贴的第二段代码里,char text[] = "some text";是正常的——因为字符串字面量在编译时会自动在末尾添加'\0',所以printf("%s")能正确输出。但btext[20]同样被你填满了'x',没有留终止符的位置,后续如果用%s输出btext,肯定也会出现类似的乱码问题,修复方式和上面一样。

内容的提问来源于stack exchange,提问作者Bolle Sat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:53:48