C++中三个字符数组比较逻辑错误排查
问题排查与解决:三个字符数组比较的逻辑漏洞
我帮你梳理了代码里的问题,核心是逻辑分支的顺序和覆盖范围出错了。
当c2和c3相等但c1和它们不同时,程序会走到第一个else,然后触发第二个判断:
if (strcmp(c1, c2) != 0 && strcmp(c1, c3) != 0) { cout << "The three arrays are different" << endl; }
这个条件此时是成立的(毕竟c1和c2、c1和c3确实都不等),所以程序直接输出“三个数组都不同”,完全没机会走到后面判断c2和c3相等的分支——前面的分支错误地把这个特殊情况归类到了“全不同”里。
解决思路:调整判断顺序,优先检查两两相等的情况
我们可以把逻辑顺序反过来:先检查每一对是否相等,最后再判断是否三个都不同。这样既不会出现分支被提前覆盖的问题,代码结构也会更清晰。
修改后的代码
#include <iostream> #include <string.h> using namespace std; #define MAX 20 int main() { char c1[MAX], c2[MAX], c3[MAX]; cout << "Introduce array 1: "; cin >> c1; cout << "Introduce array 2: "; cin >> c2; cout << "Introduce array 3: "; cin >> c3; // 先把判断条件抽成布尔变量,让逻辑更直观 bool allEqual = (strcmp(c1, c2) == 0) && (strcmp(c1, c3) == 0); bool pair12Equal = (strcmp(c1, c2) == 0) && !allEqual; bool pair13Equal = (strcmp(c1, c3) == 0) && !allEqual; bool pair23Equal = (strcmp(c2, c3) == 0) && !allEqual; if (allEqual) { cout << "The three arrays are equal" << endl; } else if (pair12Equal) { cout << "1 and 2 are equal" << endl; } else if (pair13Equal) { cout << "1 and 3 are equal" << endl; } else if (pair23Equal) { cout << "2 and 3 are equal" << endl; } else { cout << "The three arrays are different" << endl; } return 0; }
代码说明
- 用布尔变量把判断逻辑抽离出来,避免多层嵌套导致的逻辑混乱
- 先判断三个数组全相等的情况
- 再依次判断每一对相等的情况(用
!allEqual排除“全相等”的重复判断) - 最后如果以上情况都不满足,才判定三个数组完全不同
这样修改后,所有场景都能正确输出——包括你之前出错的c2和c3相等但c1不同的情况。
内容的提问来源于stack exchange,提问作者AnonymousDeveloper
相关产品推荐
相关产品推荐

