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

如何在main函数中正确打印Concat函数生成的新拼接序列?

问题分析与解决方案

核心错误原因

  • 当触发sequence[0] == piece[1]的条件时,你执行了sequence = strcat(piece, sequence)——这只是让函数内部的sequence指针指向了piece数组的地址,但main函数里的sequence数组完全没被修改。C语言中数组作为参数传递时,修改函数内部的指针变量不会影响外部的数组,此时拼接结果存在piece里,但main依然打印原sequence数组,自然输出错误。
  • 另外,原代码里的sequence = strcat(...)完全多余,strcat会直接修改目标数组的内容,不需要重新给指针赋值。

修正方案

我们需要确保不管哪种拼接逻辑,最终结果都写入到main传入的sequence数组中,具体修正后的代码如下:

完整修正代码

#define BUFFER 50
#include <string.h>
#include <stdio.h>

int Concat(char sequence[], char piece[]) {
    int sequenceValid = 1;
    int lenSeq = strlen(sequence);
    int lenPiece = strlen(piece);
    
    // 提前检查缓冲区是否足够,避免溢出
    if (lenSeq + lenPiece >= BUFFER) {
        return 0;
    }

    if (sequence[lenSeq - 1] == piece[0]) {
        // 直接把piece拼到sequence末尾
        strcat(sequence, piece);
    } else if (sequence[0] == piece[1]) {
        // 要把piece放在前面,先保存原sequence到临时缓冲区
        char temp[BUFFER];
        strcpy(temp, sequence);
        // 把piece复制到sequence开头
        strcpy(sequence, piece);
        // 再把原sequence内容拼到后面
        strcat(sequence, temp);
    } else {
        sequenceValid = 0;
    }
    return sequenceValid;
}

int main() {
    char piece[BUFFER], sequence[BUFFER];
    scanf("%s", sequence);
    scanf("%s", piece);

    if (Concat(sequence, piece)) {
        printf("%s", sequence);
    } else {
        printf("piece %s cannot be added to %s.", piece, sequence);
    }
    return 0;
}

关键修改说明

  1. 新增缓冲区溢出检查:计算两个字符串长度之和,若超过缓冲区大小直接返回无效,避免内存溢出风险。
  2. 重构第二种拼接逻辑:
    • 用临时数组temp保存原sequence内容,防止被覆盖。
    • 先将piece复制到sequence数组,再把原sequence内容拼到后面,确保最终结果存在sequence里,main打印时能获取正确拼接结果。

测试验证

输入:

166335
21

此时sequence[0]与piece[1]均为'1',触发第二种拼接逻辑,最终sequence数组内容为21166335,与期望输出一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:33:30