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

C语言递归实现字符串重复N次仅生效2次,求助排查代码问题

问题排查与修复

核心问题分析

1. puissant递归逻辑错误

你的puissant函数每次递归都执行concatination(w,w,p),这相当于每次都用原始字符串w和w拼接的结果覆盖p,而不是把w追加到当前p的末尾。比如当t=3时,三次递归都会生成w+w的结果,最终p里始终只有两次重复的字符串,无法实现累积拼接。

2. concatination函数设计缺陷

当前的concatination只能完成一次两个字符串的拼接,但没有返回拼接后的末尾位置,导致后续无法在已有结果的基础上继续追加新的字符串。

修复后的代码

修正concatination函数

让函数返回拼接完成后的末尾指针(即新的'\0'位置),方便后续追加操作:

char* concatination(char w1[], char w2[], char concat[]) {
    if (*w1 != '\0') {
        *concat = *w1;
        return concatination(w1 + 1, w2, concat + 1);
    }
    if (*w2 != '\0') {
        *concat = *w2;
        return concatination(w1, w2 + 1, concat + 1);
    }
    *concat = '\0';
    return concat;
}

修正puissant递归逻辑

每次递归时,先完成t-1次拼接,再把w追加到结果末尾,实现累积重复:

char* puissant(char w[], char p[], int t) {
    if (t == 1) {
        // 第一次递归,先把原始字符串复制到p中
        char* end = p;
        while (*w != '\0') {
            *end++ = *w++;
        }
        *end = '\0';
        return p;
    }
    // 先递归得到前t-1次拼接的结果,再追加一次w
    char* current_end = puissant(w, p, t - 1);
    concatination(w, "", current_end); // 把w拼接到current_end位置
    return p;
}

修正main函数的输入问题

gets函数存在缓冲区溢出风险,改用fgets替代,并处理输入字符串中的换行符:

#include <stdio.h>
#include <string.h>

// 上面的concatination和puissant函数放在这里

int main() {
    char w1[20];
    char p[100]; // 扩大p的容量,避免拼接后溢出
    int t;

    // 读取字符串,去掉换行符
    fgets(w1, sizeof(w1), stdin);
    w1[strcspn(w1, "\n")] = '\0';

    scanf("%d", &t);
    puts(puissant(w1, p, t));
    return 0;
}

修复说明

  1. concatination现在返回拼接后的末尾指针,让后续的追加操作能精准定位到当前字符串的结尾。
  2. puissant递归时,先完成t-1次拼接,再把w追加到结果末尾,实现N次累积重复。
  3. 扩大了p的数组容量,避免多次拼接后超出缓冲区;同时替换gets为安全的fgets。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 02:17:48