求字符串中最常用字符,为什么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
#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,我悟了,谢啦
不知道你这个问题是否已经解决, 如果还没有解决的话: