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

不使用字符串库函数与数组表示法,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:33:50