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; }
修复说明
concatination现在返回拼接后的末尾指针,让后续的追加操作能精准定位到当前字符串的结尾。puissant递归时,先完成t-1次拼接,再把w追加到结果末尾,实现N次累积重复。- 扩大了
p的数组容量,避免多次拼接后超出缓冲区;同时替换gets为安全的fgets。
内容的提问来源于stack exchange,提问作者imad
相关产品推荐
相关产品推荐

