字符串对差异识别代码样例通过但其他测试失败,请求排查
字符串差异识别程序的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
相关产品推荐
相关产品推荐

