You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

手动实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 11:53:07