C语言变位词查找器同时输出正确与错误结果的问题求助
变位词查找器同时输出两种结果的问题排查
核心错误:else分支的语法问题
你的代码里多处出现了错误的else写法,这是导致同时打印两种结果的根本原因:
字符统计循环中的错误
以第一个统计循环为例:else (s1[i] == 'd'); { counter1[3] += 1; }这里的
(s1[i] == 'd');是一个独立的表达式,末尾的分号直接终止了else的逻辑,后面的{}变成了一个无条件执行的独立代码块——不管当前字符是不是'd',这段代码都会运行。结果判断部分的错误
最后判断是否为变位词的代码:else (flag != 0); { printf("Not Anagram!"); }同样的问题,分号让else的逻辑中断,后面的
printf("Not Anagram!");变成了无条件执行的语句。所以不管flag是否为0,都会同时执行if里的printf("Anagram!")和这里的printf,导致两种结果同时输出。
修正方案
把所有错误的else写法改正确:
- 字符统计的最后一个分支,直接用
else即可(前面已经判断了a、b、c,剩下的必然是d),去掉多余的条件和分号; - 结果判断部分,
else不需要额外条件,直接紧跟代码块。
修正后的完整代码
#include <stdio.h> #include <string.h> int main(){ //Letter counter for each string int counter1[] = {0, 0, 0, 0}; int counter2[] = {0, 0, 0, 0}; // Strings to be checked char s1[] = "abcd"; char s2[] = "dcba"; // 提前计算字符串长度,避免循环中重复调用strlen int len1 = strlen(s1); int len2 = strlen(s2); //Checks letter count in string 1 for (int i = 0; i < len1; i++) { if (s1[i] == ' ') { continue; } else if (s1[i] == 'a') { counter1[0] += 1; } else if (s1[i] == 'b') { counter1[1] += 1; } else if (s1[i] == 'c') { counter1[2] += 1; } else { counter1[3] += 1; } } // Checks letter count in string 2 for (int i = 0; i < len2; i++) { if (s2[i] == ' ') { continue; } else if (s2[i] == 'a') { counter2[0] += 1; } else if (s2[i] == 'b') { counter2[1] += 1; } else if (s2[i] == 'c') { counter2[2] += 1; } else { counter2[3] += 1; } } //Checks for mismatches in the letter counters int flag = 0; int counterLen = sizeof(counter1)/sizeof(int); for (int i = 0; i < counterLen; i++ ) { if (counter1[i] != counter2[i]) { flag++; } } //Tells user if it's an anagram or not if (flag == 0) { printf("Anagram!"); } else { printf("Not Anagram!"); } return 0; }
额外优化建议
- 循环中每次调用
strlen会重复遍历字符串计算长度,提前把长度存起来能提升效率; - 如果后续要支持更多字符,可以利用ASCII码差值简化统计逻辑,比如
counter1[s1[i] - 'a']++,不用逐个写if-else判断。
内容的提问来源于stack exchange,提问作者lukimari444
相关产品推荐
相关产品推荐

