给定字符串,求出现次数最多的那个字母及次数,如有多个重复则输出最先出现的

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

void main()

{    char a[100];
    int zimu[26], b[26] = {0};
    int i, chang, more = 0,e;
    scanf_s("%d", &e);
    scanf_s("%s",a,100);
    for (i = 0; i < 26; i++)
    {
        zimu[i] = 0;
    }
    chang = strlen(a);
    for (i = 0; i < chang; i++)
    {
        if (a[i] >= 'a' && a[i] <= 'z')
            zimu[a[i] - 'a']++;//碰到一样的小写字母,则该字母所对应的序号加一
    }
    for (i = 0; i < chang; i++)
    {
        if (a[i] >= 'A' && a[i] <= 'Z')
            zimu[a[i] - 'A']++;
    }
    for (i = 0; i < 26; i++)
    {
        if (zimu[i] > more)
            more = zimu[i];     //逐个比较每个字母出现次数多少,找到最多的字母序号
    }
    for (i = 0; i < 26; i++)
    {
        if (more == zimu[i])
        {
            b[i] = i;
            printf("%c\n", i + 'a');
            break;
        }
    }
}

你这代码能找到出现最多的字母,但是这个字母不一定是最先出现的。因为你的字母是按照字母表顺序排放的,而不是出现顺序排放的。
代码修改如下:

#include<stdio.h>
#include<string.h>
void main()
{    
    char a[100];
    int zimu[26];
    char b[26] = {0};
    int i, chang, more = 0,e;
    int j,nmb = 0; //这里额外定义一个变量
    char ch ; //额外定义一个字符变量
    scanf_s("%d", &e); //这个e是干啥用的?
    scanf_s("%s",a,100);
    for (i = 0; i < 26; i++)
    {
        zimu[i] = 0;
    }
    chang = strlen(a);
    for (i = 0; i < chang; i++)
    {
        if (a[i] >= 'A' && a[i] <= 'Z')
            ch = a[i] + 32;
        else
            ch = a[i];
        //判断ch是否已经记录
        for (j=0;j<nmb;j++)
        {
            if(ch == b[j])
                break;
        }
        //如果没有出现过,次数设为1
        if(j==nmb)
        {
            b[nmb] = ch;
            zimu[nmb] = 1;
            nmb++;
        }else
            zimu[j]++;
    }



    for (i = 0; i < 26; i++)
    {
        if (zimu[i] > more)
            more = zimu[i];     //逐个比较每个字母出现次数多少,找到最多的字母序号
    }
    for (i = 0; i < 26; i++)
    {
        if (more == zimu[i])
        {
            //b[i] = i;
            printf("%c\n", b[i]);
            break;
        }
    }
}