在线编译器 C

#include <stdio.h> void result(char s[]) { int i = 0; int counter[26] = {0}; int number; while (s[i] != '\0') { if (s[i] >= 'A' && s[i] <= 'Z') { number = s[i] - 'A'; counter[number]++; } else if (s[i] >= 'a' && s[i] <= 'z') { number = s[i] - 'a'; counter[number]++; } i++; } int max = -1; for (int j = 0; j < 26; j++) { if (counter[max] < counter[j]) { max = j; } } if (max > -1) { printf("%c", max + 'a'); } else { printf("-"); } } int main() { char a[1001]; scanf("%[^\n]", a); result(a); return 0; }
这段代码的功能是统计输入字符串中每个字母(不区分大小写)出现的次数,然后输出出现次数最多的字母(小写形式)。如果字符串中没有字母,则输出短横线。

代码整体思路正确,但有一个逻辑错误导致结果可能不正确。

- 在寻找最大次数的循环中,你使用 `counter[max]` 来比较,但 `max` 初始值是 -1,这会导致数组越界访问。应该用一个有效的索引(比如 0)来初始化 `max`,或者单独处理第一个元素。
- 另外,当所有字母出现次数都为 0 时,`max` 最终可能还是 0,但此时应该输出短横线。你需要区分“有字母出现”和“没有字母出现”的情况。