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
相关产品推荐
相关产品推荐

