无标准库函数实现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; }
关键细节解释
- my_strlen的作用:标准库的
strlen本质就是干这个事——遍历到'\0'统计长度,我们手动实现一遍,就是为了完全不依赖字符串操作的标准库函数。 - 内存分配的必要性:不能直接在原字符串s1后面拼接,因为s1如果是字符串常量(比如
"AA"),它的内存是只读的,强行写入会导致程序崩溃;就算s1是可写数组,也不一定有足够的空间容纳s2。所以必须新分配一块内存。 - 结束符的重要性:如果忘了加
'\0',后续打印或者使用这个字符串时,程序会一直读取内存直到遇到随机的'\0',结果就是乱码甚至程序崩溃。 - 内存释放:
malloc分配的内存属于堆内存,不会自动回收,所以调用完my_strcat后,一定要用free释放,不然会造成内存泄漏。
额外注意点
- 输入的s1和s2必须是合法的、以
'\0'结尾的字符串,不然my_strlen会无限遍历,导致错误。 - 如果不想用
malloc(比如想在栈上分配),需要提前知道总长度,但栈内存空间有限,只适合短字符串,堆内存的方式更通用。
内容的提问来源于stack exchange,提问作者Kelvijn
相关产品推荐
相关产品推荐

