c语言编写一个程序,统计输入一行字符串中各个字母使用频率(大小写不区分,字符串中不含空格),将次数不为零的字母及次数按照字母ASCII码从小到大输出。
时间: 2024-12-10 15:49:08 浏览: 74
C语言程序设计-输入一行字符,分别统计出英文大小写字母、空格、数字和其他字符的个数
5星 · 资源好评率100%
在C语言中,你可以通过以下几个步骤来编写一个统计字符串中字母频率并按字母顺序输出的程序:
1. 定义一个结构体 `Frequency` 来存储每个字符及其对应的计数。
2. 创建一个 `freq_map` 数组或哈希表,其中的键是字符(转换为小写),值是对应的 `Frequency` 结构体实例。
3. 遍历输入的字符串,对于每个字符,首先转换为小写,然后检查它是否已经在 `freq_map` 中。如果不在,创建一个新的 `Frequency` 实例;如果已在,增加计数。
4. 遍历整个数组,找出非零计数的字符,并按照 ASCII 码排序。
5. 输出每个字符及其频率。
以下是简化版的示例代码:
```c
#include <stdio.h>
#include <ctype.h>
#include <string.h>
typedef struct {
char ch;
int count;
} Frequency;
// 比较两个字符按照ASCII码排序
int compare_freq(const void* a, const void* b) {
const Frequency* fa = (const Frequency*)a;
const Frequency* fb = (const Frequency*)b;
return fa->ch - fb->ch;
}
void count_and_sort(char str[]) {
int len = strlen(str);
char lower_str[len]; // 转换后的全小写字符串
memset(lower_str, 0, len);
Frequency freq_map[256] = {0}; // 初始化为0
for (int i = 0; i < len; i++) {
char ch = tolower((unsigned char)str[i]);
if (isalpha(ch)) { // 只统计字母
freq_map[ch].count++;
}
lower_str[i] = ch;
}
// 对非零计数的字母按照ASCII码排序
qsort(freq_map, sizeof(freq_map), sizeof(Frequency), compare_freq);
printf("Sorted Characters and Frequencies:\n");
for (int i = 0; i < 256; i++) {
if (freq_map[i].count > 0) {
printf("%c: %d\n", freq_map[i].ch, freq_map[i].count);
}
}
}
int main() {
char input[100];
printf("Enter a string without spaces: ");
fgets(input, sizeof(input), stdin);
input[strcspn(input, "\n")] = '\0'; // remove newline character at end of fgets
count_and_sort(input);
return 0;
}
```
阅读全文