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

无标准库函数实现C++中char*字符串拼接的方法探究

没问题!咱们来彻底搞懂不依赖标准库函数的字符串拼接——这其实是理解C语言字符串本质的绝佳例子,我会一步步拆解原理,再给你实现代码,最后把每个细节讲清楚。

手动拼接字符串的核心逻辑

C语言的字符串根本不是什么特殊类型,就是以'\0'(空字符)结尾的char数组。所以拼接两个字符串的核心步骤完全是实打实的内存和字符操作:

  • 先算出两个输入字符串的总长度(别忘了给最后的'\0'留位置)
  • 申请一块足够大的内存来存放拼接后的结果
  • 把第一个字符串的每个字符逐个复制到新内存里
  • 接着把第二个字符串的字符复制到第一个的末尾
  • 最后在拼接结果的末尾加上'\0',保证它是合法的C字符串
完整实现代码

结合你给出的测试用例(S1="AA"、S2="BB"),我写了完整的可运行代码,包括手动实现的长度计算和拼接函数:

#include <stdio.h>
#include <stdlib.h> // 这里只用内存管理的malloc/free,不算字符串操作标准库

// 手动实现字符串长度计算(替代标准库的strlen)
int my_strlen(const char *str) {
    int len = 0;
    // 遍历到空字符就停止,统计走过的字符数
    while (str[len] != '\0') {
        len++;
    }
    return len;
}

// 自定义字符串拼接函数
char* my_strcat(const char *s1, const char *s2) {
    // 1. 计算两个字符串的长度
    int len1 = my_strlen(s1);
    int len2 = my_strlen(s2);
    // 总长度 = s1长度 + s2长度 + 1(+1是给最后的'\0'留位置)
    int total_len = len1 + len2 + 1;
    
    // 2. 分配堆内存,必须检查是否分配成功(内存不足时malloc会返回NULL)
    char *result = (char*)malloc(total_len * sizeof(char));
    if (result == NULL) {
        printf("内存分配失败!\n");
        return NULL;
    }
    
    // 3. 复制s1到结果内存
    int i = 0;
    while (i < len1) {
        result[i] = s1[i];
        i++;
    }
    
    // 4. 复制s2到s1的末尾
    int j = 0;
    while (j < len2) {
        result[i + j] = s2[j];
        j++;
    }
    
    // 5. 加上字符串结束符,这一步绝对不能忘!
    result[i + j] = '\0';
    
    return result;
}

// 测试代码
int main() {
    const char *s1 = "AA";
    const char *s2 = "BB";
    char *combined = my_strcat(s1, s2);
    
    if (combined != NULL) {
        printf("拼接结果:%s\n", combined);
        // 记得释放堆内存,避免内存泄漏
        free(combined);
    }
    return 0;
}
关键细节解释
  1. my_strlen的作用:标准库的strlen本质就是干这个事——遍历到'\0'统计长度,我们手动实现一遍,就是为了完全不依赖字符串操作的标准库函数。
  2. 内存分配的必要性:不能直接在原字符串s1后面拼接,因为s1如果是字符串常量(比如"AA"),它的内存是只读的,强行写入会导致程序崩溃;就算s1是可写数组,也不一定有足够的空间容纳s2。所以必须新分配一块内存。
  3. 结束符的重要性:如果忘了加'\0',后续打印或者使用这个字符串时,程序会一直读取内存直到遇到随机的'\0',结果就是乱码甚至程序崩溃。
  4. 内存释放:malloc分配的内存属于堆内存,不会自动回收,所以调用完my_strcat后,一定要用free释放,不然会造成内存泄漏。
额外注意点
  • 输入的s1和s2必须是合法的、以'\0'结尾的字符串,不然my_strlen会无限遍历,导致错误。
  • 如果不想用malloc(比如想在栈上分配),需要提前知道总长度,但栈内存空间有限,只适合短字符串,堆内存的方式更通用。

内容的提问来源于stack exchange,提问作者Kelvijn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:08:18