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

为何程序输出结果为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:05:26