c,求字符串中最常用字符

求字符串中最常用字符,为什么max取不到i=0的值


#include
#include
#include

#define N 101
//a---z : 97--122
int main(){
    char str[N];
    gets(str);//输入字符串

    int len = strlen(str);
    int alp[26]={0};
    
    for(int i=0;iif(isalpha(str[i])){//如果是字母
            alp[(tolower(str[i]))%97]++;
        }
    }
    
    int max=0;
    for(int i=0;i<26;i++){
        if(maxprintf("%c",97+max);

    return 0;
}
//An apple

  • 你这个 max 求的不对,这个max应该是 最多的字母所在的 索引。
  • 修改如下:
 
#include<stdio.h>
#include<string.h>
#include<ctype.h>
 
#define N 101
//a---z : 97--122
int main(){
    char str[N];
    gets(str);//输入字符串
 
    int len = strlen(str);
    int alp[26]={0};
    
    for(int i=0;i<len;i++){
        if(isalpha(str[i])){//如果是字母
            alp[(tolower(str[i]))%97]++;
        }
    }
    
    int maxIndex=0;
    for(int i=0;i<26;i++){
        if(alp[maxIndex]<alp[i])maxIndex=i;
    }
 
    printf("%c",97+maxIndex);
 
    return 0;
}
//An apple


alp[(tolower(str[i]))%97]++;
->
alp[(tolower(str[i]))-97]++;

该回答引用GPTᴼᴾᴱᴺᴬᴵ
在你的代码中,max是用来存储最常用字符的下标,而不是出现次数。因此,当你遍历整个数组时,你需要将max设置为一个较小的值,以确保它可以在后续的比较中被更新。例如,你可以将max初始化为-1,然后在找到第一个大于0的元素时,将max设置为i,然后在后续的比较中更新max。

另外,你可能会发现在输入字符串时使用gets函数是不安全的,因为它没有对输入的字符串长度进行检查,可能会导致缓冲区溢出。建议改用fgets函数,并将缓冲区长度限制为N。例如:

fgets(str, N, stdin);

以下是修改后的代码:

#include<stdio.h>
#include<string.h>
#include<ctype.h>

#define N 101
//a---z : 97--122
int main(){
    char str[N];
    fgets(str, N, stdin);//输入字符串

    int len = strlen(str);
    int alp[26]={0};

    int max=-1;//将max初始化为-1
    for(int i=0;i<len;i++){
        if(isalpha(str[i])){//如果是字母
            alp[(tolower(str[i]))%97]++;
            if(max==-1||alp[max]<alp[i]) max=i;//在找到第一个大于0的元素时,将max设置为i
        }
    }

    printf("%c",97+max);

    return 0;
}
//An apple


这将输出'a',因为它是字符串中出现最多的字符。

ok,我悟了,谢啦

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^