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

指针版strcat函数实现异常:目标数组拼接后无变化问题排查

问题分析与修正

你的strpcat函数存在指针与索引混用导致的位置计算错误,这是拼接未生效的核心原因:

错误点拆解

  • 第一个while循环中,你同时对指针s执行自增操作,又累加索引i。循环结束时,s已经指向目标字符串末尾'\0'的下一个内存位置,而i的值等于原字符串的长度。此时你用*(s+i)赋值,相当于直接写到了目标数组a的远超出预期的位置(甚至可能越界),完全没有覆盖原字符串的'\0'位置,自然无法实现拼接效果。
  • 额外的i变量属于冗余设计,同时操作指针和索引很容易导致逻辑混乱。

修正方案

方案1:纯指针实现(更符合指针操作的思路)

#include <stdio.h>

void strpcat(char *s, char *t) {
    // 移动指针到目标字符串的末尾('\0'所在位置)
    while (*s != '\0') {
        s++;
    }
    // 从末尾开始复制t的内容,直到t的'\0'被复制完成
    while ((*s = *t) != '\0') {
        s++;
        t++;
    }
}

int main(void) {
    char a[20] = "Hello";
    char b[] = "Bye";
    strpcat(a, b);
    printf("%s\n", a);

    return 0;
}

方案2:纯索引实现(避免指针偏移的混淆)

如果习惯用数组索引,也可以完全放弃指针移动,只用索引定位:

#include <stdio.h>

void strpcat(char *s, char *t) {
    int i = 0;
    // 找到目标字符串的末尾索引
    while (s[i] != '\0') {
        i++;
    }
    // 从末尾索引开始拼接t的内容
    while ((s[i] = *t++) != '\0') {
        i++;
    }
}

int main(void) {
    char a[20] = "Hello";
    char b[] = "Bye";
    strpcat(a, b);
    printf("%s\n", a);

    return 0;
}

两种方案都能正确将b拼接到a的末尾,运行后会输出HelloBye。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 12:53:18