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

C语言变位词查找器同时输出正确与错误结果的问题求助

变位词查找器同时输出两种结果的问题排查

核心错误:else分支的语法问题

你的代码里多处出现了错误的else写法,这是导致同时打印两种结果的根本原因:

  1. 字符统计循环中的错误
    以第一个统计循环为例:

    else (s1[i] == 'd'); {
      counter1[3] += 1;
    }
    

    这里的(s1[i] == 'd');是一个独立的表达式,末尾的分号直接终止了else的逻辑,后面的{}变成了一个无条件执行的独立代码块——不管当前字符是不是'd',这段代码都会运行。

  2. 结果判断部分的错误
    最后判断是否为变位词的代码:

    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:23:08