编辑代码

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

// 结构体用于存储字母和对应的出现次数
typedef struct 
{
    char letter;
    int count;
} 
LetterCount;

// 比较函数,用于排序字母出现次数,如果次数相同则按照字母的自然顺序排序
int compare(const void *a, const void *b) {
    LetterCount *countA = (LetterCount *)a;
    LetterCount *countB = (LetterCount *)b;
    
    if (countA->count != countB->count) {
        return countB->count - countA->count;
    } else {
        return countA->letter - countB->letter;
    }
}

// 统计字符串中各个字母的出现次数并排序
void countLetters(char* str) {
    int length = strlen(str);
    LetterCount letterCounts[52];  // 存储字母出现次数的数组,最多52个字母
    
    // 初始化字母出现次数的数组
    for (int i = 0; i < 52; i++) {
        if (i < 26) {
            letterCounts[i].letter = 'a' + i;
        } else {
            letterCounts[i].letter = 'A' + i - 26;
        }
        letterCounts[i].count = 0;
    }
    
    // 统计字母出现次数
    for (int i = 0; i < length; i++) {
        if (isalpha(str[i])) {
            int index;
            if (islower(str[i])) {
                index = str[i] - 'a';  // 小写字母的索引
            } else {
                index = str[i] - 'A' + 26;  // 大写字母的索引
            }
            letterCounts[index].count++;
        }
    }
    
    // 排序字母出现次数
    qsort(letterCounts, 52, sizeof(LetterCount), compare);
    
    // 输出结果
    for (int i = 0; i < 52; i++) {
        if (letterCounts[i].count > 0) {
            printf("%c:%d;", letterCounts[i].letter, letterCounts[i].count);
        }
    }
    printf("\n");
}

int main() {
    char str[10000] = {'\0'};
    scanf("%s",str);
    countLetters(str);
    return 0;
}