Онлайн компилятор C

#include <stdio.h> int have_letter(int s[]) { int flag = 0; for (int i = 0; i < 26; i++) { if (s[i] > 0) { flag = 1; } } return flag; } 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++; } have_letter(counter); if (!have_letter) { printf("-"); } else { int max = 0; for (int j = 0; j < 26; j++) { if (counter[max] < counter[j]) { max = j; } } printf("%c", max + 'a'); } } int main() { char a[1001]; scanf("%[^\n]", a); result(a); return 0; }
这段代码的功能是:读取一行字符串,统计其中每个英文字母(不区分大小写)出现的次数,然后输出出现次数最多的字母(小写形式)。如果字符串中没有字母,则输出短横线 `-`。

代码中存在一个逻辑错误。在 `result` 函数中,你调用了 `have_letter(counter)`,但这一行并没有保存返回值,紧接着你又写了一个 `if (!have_letter)`,这里的 `have_letter` 是函数名,而不是函数的返回值。因此条件判断总是为假(因为函数名作为指针非零),导致程序永远不会输出短横线。

- 调用 `have_letter` 后,应该用一个变量接收它的返回值,然后在 `if` 条件中使用这个变量。
- 另外,`have_letter` 函数中,一旦发现某个字母计数大于0,可以立即返回1,不需要遍历完整个数组,这样效率更高。