C语言字符串操作异常:输出乱码t§■a而非预期内容求助
问题分析与修复
核心问题
- 数组越界引发内存溢出:你定义的
s1是固定长度字符数组,初始内容"once upon a "的长度(含终止符)已占满数组空间,用strcat追加s2会直接越界写入非法内存,这就是乱码t§■a的根源。 - 操作逻辑完全偏离需求:你要把
s2插入到s1中"a"的前方,但代码用strcat直接追加到末尾,完全不符合插入逻辑;另外strcpy(s1, s1)是毫无意义的冗余操作。
修复后的代码
#include <stdio.h> #include <string.h> int main(){ // 定义足够大的数组,避免越界 char s1[100] = "once upon a"; char s2[] = "time "; char *a_pos = strstr(s1, "a"); // 定位s1中"a"的位置 if (a_pos != NULL) { // 把"a"及后续内容后移,留出s2的插入空间 memmove(a_pos + strlen(s2), a_pos, strlen(a_pos) + 1); // 将s2复制到空出的位置 strncpy(a_pos, s2, strlen(s2)); } puts(s1); // 输出插入后的完整字符串:once upon time a // 打印"a"之后的内容 a_pos = strstr(s1, "a"); if (a_pos != NULL) { printf("%s\n", a_pos + 1); // 跳过"a"字符,打印后续内容 } return 0; }
关键说明
- 把
s1定义为char s1[100],预留足够空间存放插入后的字符串,彻底解决越界问题。 - 用
strstr定位"a"的位置,通过memmove(内存区域重叠时不能用memcpy)将"a"及后续内容后移,再用strncpy把s2插入到空出的位置。 - 打印"a"之后的内容时,找到"a"的指针后,直接取
a_pos + 1即可跳过"a"字符。
内容的提问来源于stack exchange,提问作者anonymous engineer
相关产品推荐
相关产品推荐

