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

#include <stdio.h> int main() { char a[1001]; scanf("%[^\n]", a); long long int p = 0; while(a[p] != '\0' ) { p++; } int b[26] = {0}; int num; for(int i = 0; i < p; i++) { if(a[i] >= 'a' && a[i] <= 'z') { num = a[i] - 'a'; b[num]++; } if(a[i] >= 'A' && a[i] <= 'Z') { num = a[i] - 'A'; b[num]++; } } int max = b[25], save = 0; for(int i = 25; i >= 0; i--) { if(b[i] >= max) { max = b[i]; save = i; } } char c =(char)(save + 'a'); printf("%c", c); return 0; }
这段代码的功能是:读取一行字符串,统计其中每个英文字母(不区分大小写)出现的次数,然后输出出现次数最多的字母(如果有多个,输出字母表中靠后的那个)。

代码整体思路正确,但存在一个逻辑问题:

- 在寻找最大值的循环中,你从 `i = 25` 开始向下遍历,并且条件写的是 `if(b[i] >= max)`。这样当遇到相同最大值时,会更新为更靠后的字母(因为从后往前遍历)。但注意,`max` 初始值设为 `b[25]`,如果 `b[25]` 本身就是最大值,那么第一次循环时 `b[25] >= max` 成立,会更新 `save = 25`,这没问题。但问题在于,如果后面有字母出现次数相同,由于条件包含等于,会不断更新为更靠后的字母,这符合你的意图吗?请确认题目要求是否要输出字母表顺序最靠前的那个。

- 另外,如果所有字母出现次数都是0(比如输入只有数字或符号),`max` 初始为 `b[25]` 也是0,那么 `save` 最终会是25,输出 'z',这可能不是期望的结果。考虑一下这种情况应该如何处理。