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

字符串对差异识别代码样例通过但其他测试失败,请求排查

字符串差异识别程序的Bug排查

我开发了一个识别两个字符串差异的程序,样例测试输出正确,但其他测试用例运行失败,且无法查看这些测试用例的具体内容。

输入输出要求

输入要求

  • 第一行输入整数n(1<=n<=500),代表测试用例数量。
  • 每个测试用例包含两行长度相同的字符串,长度为1-50字符,仅包含字母(a-z,A-Z)或数字(0-9)。

输出要求

  • 每个测试用例按输入顺序输出两行字符串,第三行用.标记相同字符,*标记不同字符。
  • 每个测试用例后输出一个空行。

原代码

int main()
{
     
    int n;
    
    // scan the integer for number of test cases
    if(scanf("%d", &n) != 1) {
        return 1;
    }

    //Loop through the test cases
    for (int i = 0; i < n; i++)
    {
        char string1[1024], string2[1024], output[50];

        //Scan first and second string
        if(scanf("%s", string1) != 1) {
            return 1;
        }
        
        if(scanf("%s", string2) != 1) {
            return 1;
        }

        //Loop through the strings and compare them
        for (int i = 0; string1[i] != '\0' || string2[i] != '\0'; i++)
        {
            //Convert to lowercase
            string1[i] = tolower(string1[i]);
            string2[i] = tolower(string2[i]);

            //Compare
            if (string1[i] == string2[i])
            {
                output[i] = '.';
            } else {
                output[i] = '*';
            }
            
        }

        //Print the strings and the output.
        printf("%s\n%s\n%s\n", string1, string2, output);

        if(i + 1 < n) {
            printf("\n");
        }
        

    }
    
    
    return 0;
}

代码存在的问题

  • 变量名冲突:外层测试用例循环的计数器是i,内层字符串比较循环也用i作为计数器,会直接覆盖外层的i值,导致测试用例循环逻辑完全混乱,后续测试用例无法正常执行。
  • output数组缺少结束符:output数组仅赋值了每个位置的.或*,但未在末尾添加'\0',调用printf("%s", output)时会读取数组外的垃圾数据,引发输出乱码或程序崩溃。
  • tolower参数类型问题:tolower要求输入为unsigned char类型,若输入字符的ASCII值为负数(虽题目限定输入范围,但仍需规范),会触发未定义行为。
  • output数组长度不足:题目规定字符串最长50字符,output定义为char output[50],但字符串需要额外空间存储结束符,应改为char output[51],否则长度为50时会越界。
  • 循环条件冗余:题目明确两个字符串长度相同,内层循环只需判断其中一个字符串到结束符即可,原条件string1[i] != '\0' || string2[i] != '\0'虽不会出错,但存在冗余,若字符串长度不一致还会引发越界。

修复后的代码示例

#include <stdio.h>
#include <ctype.h>

int main()
{
    int n;
    
    if(scanf("%d", &n) != 1) {
        return 1;
    }

    // 重命名外层循环变量,避免冲突
    for (int case_idx = 0; case_idx < n; case_idx++)
    {
        char string1[1024], string2[1024], output[51];

        if(scanf("%s", string1) != 1) {
            return 1;
        }
        
        if(scanf("%s", string2) != 1) {
            return 1;
        }

        int i = 0;
        while (string1[i] != '\0')
        {
            // 转换为unsigned char避免tolower的未定义行为
            char c1 = tolower((unsigned char)string1[i]);
            char c2 = tolower((unsigned char)string2[i]);

            output[i] = (c1 == c2) ? '.' : '*';
            i++;
        }
        // 添加字符串结束符
        output[i] = '\0';

        printf("%s\n%s\n%s\n", string1, string2, output);

        if(case_idx + 1 < n) {
            printf("\n");
        }
    }
    
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:01:16