输入一个字符串,统计各字母出现的次数,并按字母出现的多少输出(先输出字母出现多的,次数相同的按字母表顺序输出,不出现的不输出)

(定义串数组与字符数组[26],字符数组26个下标元素变量存放字母字符'a'-'z'。
定义整型数组[26],整型数组26个下标元素变量存放串对应字母a-z的统计个数)
例:输入:5b3a+4-hdeh5dh?(字母不计大小写)
输出:h 3
d 2
a 1
b 1
e 1

img

#include<stdio.h>
#include<string.h>
 int main()
{
    void number(char *p);
    char str[100];
    fflush(stdin);
    gets(str);
    number(str);
    return 0;
}
void number(char* p)
{
     char s[] = { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' };
     int a[26] = {0};
     while (*p != '\0')        //字符串的结束符号位"\0"
     {
         for (int i = 0; i < 26; i++)
         {
             if (*p == s[i] || *p == (s[i] - 32))
                a[i]++;
        }
         p++;
     }
     for(int i=0;i<25;i++)
         for(int j=0;j<25-i;j++)
             if (a[j] < a[j + 1])
             {
                 int temp;
                 temp = a[j];
                 a[j] = a[j + 1];
                 a[j + 1] = temp;
                 char temp1 = s[j];
                 s[j] = s[j + 1];
                 s[j + 1] = temp1;
             }
     for(int i=0;i<26;i++)
         if (a[i]!=0)
            printf("%c:%d\n", s[i], a[i]);
}

你好 利用长度为26的int类型数组
遍历数组时 如果字母都是小写的话
将每一个字母字符(范围是str[i]>='a'&&str[i]<='z') str[i]-97得到的数字对应下标值++;即a[str[i]-97]++;
遍历结束 存好了次数和字母
输出时 再按你的要求下标+97转char类型 及对应次数为数组中的数字


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
    char str[40];
    //Node info[40];
    int i, j, a[26] = { 0 };//存小写字母及其出现的次数  比如a[0]=3 表示字母‘a’出现了3次
    gets(str);
    for (i = 0;str[i] != '\0';i++)
    {
        if (str[i] >= 'a' && str[i] <= 'z')
            a[str[i] - 97]++;
    }
    for (i = 0;i < 26;i++)
    {
        int index = i; // index记录最大出现数字所在下标
        for (j = 0;j < 26;j++) //遍历完下标index所在数字为最多出现次数的
        {
            if (a[index] < a[j])
                index = j;
        }
        if (a[index] != 0)
            printf("%c\t%d\n", index + 97, a[index]);
        a[index] = 0; //打印过的字母置为0 不再参与判断
    }
    return 0;
}

截图

img