c语言结构体:编写一个程序,接收用户输入的一个字符串(可以包含空格),统计其中所有出现过的所有字符,并按照频率高低的顺序排列输出。频率相同的字符按输入顺序输出。
时间: 2024-05-15 15:14:14 浏览: 11
下面是一个使用 C 语言结构体实现该功能的程序:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 1000 // 字符串最大长度
#define MAX_CHARS 256 // 字符集大小
// 定义一个结构体表示字符和出现次数
struct CharFreq {
char c; // 字符
int freq; // 出现次数
};
// 统计字符串中每个字符的出现次数
void count_chars(const char *str, struct CharFreq *freqs, int *n) {
int len = strlen(str);
int i, j;
for (i = 0; i < len; i++) {
char c = str[i];
// 在已有的字符频率中查找该字符
for (j = 0; j < *n; j++) {
if (freqs[j].c == c) {
freqs[j].freq++;
break;
}
}
// 没找到该字符,新增一个字符频率
if (j == *n) {
freqs[j].c = c;
freqs[j].freq = 1;
(*n)++;
}
}
}
// 比较两个字符频率的大小
int cmp_char_freq(const void *p1, const void *p2) {
const struct CharFreq *f1 = (const struct CharFreq *)p1;
const struct CharFreq *f2 = (const struct CharFreq *)p2;
if (f1->freq != f2->freq) {
return f2->freq - f1->freq;
} else {
return f1 - f2;
}
}
int main() {
char str[MAX_LEN];
struct CharFreq freqs[MAX_CHARS] = {0};
int n = 0; // 字符频率数组中已有的字符数
int i;
printf("请输入一个字符串(可以包含空格):\n");
fgets(str, MAX_LEN, stdin);
count_chars(str, freqs, &n);
// 按照字符频率排序
qsort(freqs, n, sizeof(struct CharFreq), cmp_char_freq);
// 输出结果
printf("按照字符出现频率排序的结果:\n");
for (i = 0; i < n; i++) {
printf("%c %d\n", freqs[i].c, freqs[i].freq);
}
return 0;
}
```
程序首先定义了一个结构体 `CharFreq` 表示字符和出现次数,然后通过一个函数 `count_chars` 统计字符串中每个字符的出现次数,使用一个结构体数组 `freqs` 存储每个字符的出现频率。函数 `cmp_char_freq` 定义了比较两个字符频率大小的规则,然后使用 `qsort` 函数对字符频率数组进行排序。最后输出排序后的字符频率数组即可。
注意,为了方便处理,程序中使用了一个常量 `MAX_CHARS` 表示字符集大小,这里假设输入的字符串只包含 ASCII 码字符,因此字符集大小为 256。如果输入的字符串可能包含 Unicode 码字符,则需要根据实际情况调整字符集大小。