不使用字符串库函数与数组表示法,C语言指针拼接字符串故障排查
问题诊断与修复:指针拼接字符串返回空白的原因
咱们来拆解你的代码里导致返回空白的几个关键问题,再给出符合要求的修复方案:
1. 未初始化的循环变量i
你声明了int i;但没有给它赋值,这时候i的初始值是随机的垃圾值。如果这个随机值大于等于string1Len,第一个循环直接跳过,新字符串里连第一个字符串的内容都不会被复制,自然返回空白。
2. 内存分配遗漏了字符串终止符
C语言的字符串必须以'\0'结尾才能被正确识别。你计算的length是两个字符串长度之和,但malloc的时候只分配了length个字符的空间,没有给终止符留位置。就算复制成功,后续输出也会因为找不到终止符而显示空白或者乱码。
3. 未添加字符串终止符
就算前面的复制都完成了,你没有在拼接后的字符串末尾加上'\0',这会导致函数返回的指针指向的内存不是合法的C字符串,输出时无法正确解析。
4. 违反了“不使用字符串库函数”的要求
你用了strlen,但题目明确要求不能用字符串库函数,所以得自己用指针实现求字符串长度的逻辑。
修复后的完整代码
#include <stdlib.h> // 仅保留malloc/free所需的头文件,不使用字符串库 char* concat(char* first, char* second) { // 用指针手动计算第一个字符串的长度 int string1Len = 0; char* tempFirst = first; while (*tempFirst != '\0') { string1Len++; tempFirst++; } // 用指针手动计算第二个字符串的长度 int string2Len = 0; char* tempSecond = second; while (*tempSecond != '\0') { string2Len++; tempSecond++; } // 分配内存:总长度+1,给终止符预留位置 int totalLength = string1Len + string2Len; char* result = malloc(sizeof(char) * (totalLength + 1)); if (result == NULL) { // 检查内存分配是否成功,避免空指针操作 return NULL; } // 复制第一个字符串到结果 char* dest = result; while (*first != '\0') { *dest = *first; dest++; first++; } // 复制第二个字符串到结果 while (*second != '\0') { *dest = *second; dest++; second++; } // 添加字符串终止符,确保返回合法C字符串 *dest = '\0'; return result; }
修复要点解释
- 变量初始化:所有循环变量和计数器都初始化为0,避免垃圾值干扰逻辑。
- 手动计算长度:完全用指针遍历字符串直到遇到
'\0',不依赖任何字符串库函数。 - 正确内存分配:总长度加1,保证有空间存放字符串终止符。
- 添加终止符:拼接完成后必须在末尾写入
'\0',确保返回的是可被正确解析的C字符串。 - 内存检查:
malloc可能分配失败返回空指针,提前处理避免后续崩溃。
这样修改后,函数就能正确拼接两个字符串并返回有效的新字符串了。
内容的提问来源于stack exchange,提问作者Jason B
相关产品推荐
相关产品推荐

