C语言实现两词最大重叠合并:代码问题排查
单词重叠合并功能错误排查与修复
任务要求
从输入流读取若干行数据:
- 第一行是测试用例数量N(N < 32);
- 后续N行每行包含两个用空格分隔的单词(每个单词长度不超过32)。
需将每组的两个单词合并为一个新单词,要求:
- 第一个单词的结尾与第二个单词的开头重叠,例如
mountain+insane=mountainsane; - 若存在多种合并方式,选择重叠部分最长的方案,例如
papa+papaha=papaha(而非papapapaha); - 禁止使用
"%c"格式逐字符输出结果,必须拼接成完整字符串后用"%s"格式输出。
现有代码
#include <stdio.h> #include <string.h> int word_length(char *str) { unsigned short int i; for (i = 0; str[i] != '\0'; i++); return i; } int main() { char word_1[32], word_2[32], line[64][64]; unsigned short int n, line_number, i, j, k; scanf("%hu", &n); for (line_number = 0; line_number < n; line_number++) { scanf("%s %s", word_1, word_2); if (word_2[0] == word_1[0] && word_2[1] == word_1[1]) { for (i = 0; i < word_length(word_2); i++) { line[line_number][i] = word_2[i]; } } else { for (j = 0; j < word_length(word_1); j++) { if (word_2[0] != word_1[j]) { line[line_number][j] = word_1[j]; } else { line[line_number][j] = word_2[j]; break; } } for (k = j; k <= word_length(word_2); k++) { line[line_number][k] = word_2[k - 1]; } } } printf("\n"); for (line_number = 0; line_number < n; line_number++) { printf("%s\n", line[line_number]); } return 0; }
问题分析
原代码核心逻辑完全偏离需求,主要错误点:
- 无意义的前置判断:开头
if (word_2[0] == word_1[0] && word_2[1] == word_1[1])的条件毫无依据,只要两个单词前两个字符相等就直接取第二个单词,完全无视重叠规则。 - 重叠匹配逻辑混乱:仅寻找第一个单词中与第二个单词首字母匹配的位置,直接替换字符并终止遍历,未检查后续字符是否连续匹配,且字符赋值索引错误(用第一个单词的索引取第二个单词的字符)。
- 未处理最长重叠:未遍历所有可能的重叠长度,无法找到最长的有效重叠部分。
- 字符串未终止:拼接后的字符串未添加
'\0',导致printf输出时可能出现乱码。 - 冗余函数:自定义的
word_length函数可直接用标准库strlen替代,类型匹配更严谨。
修正后的代码
#include <stdio.h> #include <string.h> int main() { char word1[33], word2[33], line[64][65]; // 预留终止符空间 int n, line_num; scanf("%d", &n); for (line_num = 0; line_num < n; line_num++) { scanf("%s %s", word1, word2); int len1 = strlen(word1); int len2 = strlen(word2); int max_overlap = 0; // 从最大可能的重叠长度开始检查,找到最长有效重叠 for (int overlap = (len1 < len2) ? len1 : len2; overlap > 0; overlap--) { if (strncmp(word1 + len1 - overlap, word2, overlap) == 0) { max_overlap = overlap; break; } } // 拼接结果:word1完整内容 + word2去除重叠部分的剩余内容 strcpy(line[line_num], word1); strcat(line[line_num], word2 + max_overlap); } printf("\n"); for (line_num = 0; line_num < n; line_num++) { printf("%s\n", line[line_num]); } return 0; }
验证结果
修正后所有测试用例均符合预期:
| 测试用例 | 预期输出 | 实际输出 |
|---|---|---|
| papa mama | papamama | papamama |
| mountain insane | mountainsane | mountainsane |
| play yoga | playoga | playoga |
| papa papaha | papaha | papaha |
内容的提问来源于stack exchange,提问作者rvevau
相关产品推荐
相关产品推荐

