C语言字符数组输出多余字符求助:HELLO转HLOEL失败
问题根源:C字符串缺少终止符导致输出越界
你的程序输出异常的核心原因是C语言中使用printf("%s")输出字符串时,要求字符串必须以空字符'\0'结尾,而你定义的hi和lo数组没有预留空间存放这个终止符,导致printf读取内存时越界,直到碰到内存中随机的'\0'才停止,所以出现了多余的内容。
具体分析
- 你定义的
hi[3]用来存储偶数索引的字符(H、L、O),刚好占满3个元素的空间,没有多余位置放'\0'; lo[2]存储奇数索引的字符(E、L),同样占满全部空间,也没有'\0';- 当
printf("%s%s", hi, lo)执行时,先读取hi数组,因为没有终止符,会继续读取后续的lo数组内容,之后还会读取内存中其他无关数据,直到遇到第一个'\0',最终输出了多余的"HLO"。
修复方案
方案1:给数组预留终止符空间并手动添加
修改数组定义,多分配一个元素的空间,然后在循环结束后添加字符串终止符:
#include <stdio.h> int main() { int i, loPos=0, hiPos=0; char *str="HELLO"; char lo[3]; // 原2,+1用于存'\0' char hi[4]; // 原3,+1用于存'\0' for(i=0;i<5;i++) { if(i%2==0) { hi[hiPos++]=str[i]; } else { lo[loPos++]=str[i]; } } hi[hiPos] = '\0'; // 添加字符串终止符 lo[loPos] = '\0'; // 添加字符串终止符 printf("%s%s",hi,lo); return 0; }
方案2:逐个输出字符,不依赖字符串终止符
如果不想修改数组大小,可以直接逐个输出数组中的字符,避免printf的字符串越界读取:
#include <stdio.h> int main() { int i, loPos=0, hiPos=0; char *str="HELLO"; char lo[2]; char hi[3]; for(i=0;i<5;i++) { if(i%2==0) { hi[hiPos++]=str[i]; } else { lo[loPos++]=str[i]; } } // 逐个输出hi的字符 for(int j=0; j<hiPos; j++) { printf("%c", hi[j]); } // 逐个输出lo的字符 for(int j=0; j<loPos; j++) { printf("%c", lo[j]); } printf("\n"); return 0; }
两种方案都能输出预期的HLOEL。
内容的提问来源于stack exchange,提问作者Vikneysh Raj G G A
相关产品推荐
相关产品推荐

