手动实现strcat()函数时出现乱码问题求助
手动实现strcat()函数时出现乱码问题求助
嘿,我瞅了你的代码和输出,这乱码问题其实是俩小bug加一个隐藏大坑搞的鬼,咱们一步步说清楚:
第一个核心问题:没给拼接后的字符串加终止符
你写的ft_strcat把src的字符全拷完之后,压根没在dest末尾加字符串必须的'\0'终止符!C语言里字符串必须靠'\0'告诉函数“我到这结束了”,不然printf会疯了似的从内存里瞎读,直到碰巧撞见一个'\0',中间读着的那些垃圾数据就是你看到的�o%、�Mj%这类乱码。
第二个低级错误:赋值用错了运算符
你写的dest[i] += src[j];是把dest[i]当前的值和src[j]的ASCII码加起来,虽然第一次循环时dest[i]是'\0'(ASCII值0),加出来的结果刚好等于src[j],看起来蒙对了,但这纯纯是巧合!要是dest[i]不是0,结果直接就歪了,正确的写法必须是直接赋值:dest[i] = src[j];
第三个隐藏大坑:目标数组空间不够用
你定义的char destination[] = "hello ";,这个数组的大小是固定死的——用字符串字面量初始化的话,数组大小就是字面量的长度加1(自带一个'\0'),也就是7个字节。而你要拼的"world"有5个字符,拼接完总共至少需要6(hello 空格)+5(world)+1(终止符)=12个字节的空间,这就导致了缓冲区溢出:你写的数据超出了destination数组的地盘,瞎写到了其他内存区域,这也是为啥每次乱码都不一样的原因——每次运行时内存布局可能都不一样。
修复好的代码给你参考
#include <stdio.h> char *ft_strcat(char *dest, char *src) { int i = 0; int j = 0; // 先找到dest的末尾(终止符的位置) while (dest[i] != '\0') { i++; } // 把src的每个字符拷到dest后面 while (src[j] != '\0') { dest[i] = src[j]; // 这里改成直接赋值,别再加了! i++; j++; } dest[i] = '\0'; // 重中之重:给拼接后的字符串加终止符! return dest; } int main() { // 手动指定足够大的数组空间,比如20个字节,确保能放下拼接后的内容 char destination[20] = "hello "; char source[] = "world"; printf("%s\n", ft_strcat(destination, source)); return 0; }
修复后啥效果?
运行这个代码,你就能看到正常的hello world输出,再也不会有那些乱七八糟的乱码了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

