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

C语言实现两词最大重叠合并:代码问题排查

单词重叠合并功能错误排查与修复

任务要求

从输入流读取若干行数据:

  • 第一行是测试用例数量N(N < 32);
  • 后续N行每行包含两个用空格分隔的单词(每个单词长度不超过32)。

需将每组的两个单词合并为一个新单词,要求:

  1. 第一个单词的结尾与第二个单词的开头重叠,例如mountain + insane = mountainsane;
  2. 若存在多种合并方式,选择重叠部分最长的方案,例如papa + papaha = papaha(而非papapapaha);
  3. 禁止使用"%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;
}

问题分析

原代码核心逻辑完全偏离需求,主要错误点:

  1. 无意义的前置判断:开头if (word_2[0] == word_1[0] && word_2[1] == word_1[1])的条件毫无依据,只要两个单词前两个字符相等就直接取第二个单词,完全无视重叠规则。
  2. 重叠匹配逻辑混乱:仅寻找第一个单词中与第二个单词首字母匹配的位置,直接替换字符并终止遍历,未检查后续字符是否连续匹配,且字符赋值索引错误(用第一个单词的索引取第二个单词的字符)。
  3. 未处理最长重叠:未遍历所有可能的重叠长度,无法找到最长的有效重叠部分。
  4. 字符串未终止:拼接后的字符串未添加'\0',导致printf输出时可能出现乱码。
  5. 冗余函数:自定义的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 mamapapamamapapamama
mountain insanemountainsanemountainsane
play yogaplayogaplayoga
papa papahapapahapapaha

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:30:39