为何程序输出结果为helloworld123456??而非helloworld 1234567?
问题原因与修复方案
核心问题1:目标字符串数组空间不足
你定义的s1是char s1[] = "helloworld";,这个数组的大小是11字节("helloworld"的10个字符加上默认的终止符'\0')。而要拼接的s2是7个字符,拼接后总长度需要10+7+1=18字节,s1的空间完全不够。
当你往s1里超出它的内存范围写入数据时,会触发未定义行为——这就是你看到乱码??的根本原因,因为你改写了不属于s1的内存区域,这些区域的数据是随机的。
核心问题2:自定义mystrcat函数的逻辑低效且存在隐患
你的函数里每次循环都调用strlen(s1),而strlen需要从数组开头一直遍历到'\0'才能返回长度。随着你不断往s1里写数据,每次调用strlen都会重复遍历整个字符串,效率极低。
更糟的是,当s1空间不足导致越界写入后,内存里的'\0'可能被覆盖或者位置混乱,strlen计算出的长度会完全错误,进一步导致写入位置偏差,加剧乱码问题。
修复后的代码
#include<stdio.h> #include <string.h> char* mystrcat(char* s1, const char* s2); int main() { // 给s1分配足够的空间,确保能容纳拼接后的字符串+终止符 char s1[20] = "helloworld"; char s2[] = "1234567"; printf("%s\n", mystrcat(s1,s2)); return 0; } char* mystrcat(char* s1,const char* s2) { char *p = s1; // 先找到s1的末尾,只遍历一次 while (*p != '\0') { p++; } // 逐个复制s2的字符到s1末尾 while (*s2 != '\0') { *p = *s2; p++; s2++; } // 加上字符串终止符 *p = '\0'; return s1; }
关键修复点
- 给
s1分配足够的内存空间,避免越界写入。 - 优化
mystrcat的逻辑:只遍历一次找到s1的末尾,之后直接从该位置开始复制s2的字符,避免重复调用strlen。
内容的提问来源于stack exchange,提问作者user19994991
相关产品推荐
相关产品推荐

