用C语言统计字母出现次数
时间: 2025-05-30 15:31:17 浏览: 5
以下是使用C语言编写的程序,用于统计给定字符串中每个字母(区分大小写)的出现次数,并按指定规则排序输出:
### 示例代码
```c
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// 定义结构体存储字母及其出现次数
typedef struct {
char letter;
int frequency;
} LetterFrequency;
// 排序函数:先按频率降序排列;如果频率相等,则按自然顺序排列
int compare(const void *a, const void *b) {
LetterFrequency *letterA = (LetterFrequency *)a;
LetterFrequency *letterB = (LetterFrequency *)b;
if (letterA->frequency != letterB->frequency) {
return letterB->frequency - letterA->frequency; // 按频率降序
} else {
if (tolower(letterA->letter) == tolower(letterB->letter)) {
return isupper(letterA->letter) ? 1 : -1; // 小写字母优先于大写字母
}
return tolower(letterA->letter) - tolower(letterB->letter); // 自然顺序
}
}
int main() {
char str[256];
int counts[256] = {0};
LetterFrequency letters[256];
int index = 0;
printf("请输入一个字符串:\n");
fgets(str, sizeof(str), stdin);
// 统计字母出现次数
for (size_t i = 0; str[i] != '\0'; ++i) {
if ((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z')) {
counts[(unsigned char)str[i]]++;
}
}
// 构建字母频率表
for (char c = 'A'; c <= 'Z'; ++c) {
if (counts[c] > 0) {
letters[index].letter = c;
letters[index++].frequency = counts[c];
}
}
for (char c = 'a'; c <= 'z'; ++c) {
if (counts[c] > 0) {
letters[index].letter = c;
letters[index++].frequency = counts[c];
}
}
// 对字母频率表进行排序
qsort(letters, index, sizeof(LetterFrequency), compare);
// 输出结果
for (int i = 0; i < index; ++i) {
printf("%c: %d\n", letters[i].letter, letters[i].frequency);
}
return 0;
}
```
---
#### 解析
- **输入处理**:通过 `fgets` 获取用户输入的字符串[^3]。
- **统计逻辑**:利用数组 `counts` 记录每个字符的出现次数。对于非字母字符忽略不计。
- **数据结构设计**:定义 `LetterFrequency` 结构体来保存每个字母及其对应频次的信息。
- **排序规则**:采用自定义比较函数 `compare` 实现排序需求——首先依据频率降序排列,其次按照字母自然顺序排列,在相同字母情况下小写字母优先于大写字母[^2]。
- **输出展示**:最后遍历经过排序后的 `letters` 数组并打印每项的内容。
---
阅读全文
相关推荐

















