我写了一个代码来列出字符串中字符的出现.它有效,但我想知道,是否有可能把它整理好?例如下降.听起来很简单,但我在这里使用了两个数组,我不知道怎么可能将它们链接起来,这样它们就不会在排序后搞砸了.我读到在C++中我可以使用std :: pair但是从我发现的内容来看,在C++中没有替代品.
是不是只有一个简单的方法来排序它,以便我可以有一个大多数/最不受欢迎的字符列表?我开始进入冒泡排序,但无论我选择什么,两个阵列之间仍然没有链接.
这是代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main(int argc, char **argv) {
int hits[26] = { 0 };
char letters[26] = {
'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' };
char *line;
int i;
printf("Write the line:\n");
scanf("%25[^\n]", line);
for (i = 0; i < strlen(line); i++) {
if (!isalpha(line[i]))
continue;
hits[(int)(tolower(line[i]) - 'a')]++;
}
for (i = 0; i < 26; i++) {
printf("%c is showing up %d times.\n", letters[i], hits[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
也许我的方法中有一个简单的错误,如果有的话,那么我很乐意指出它.
首先,进行@artm 的答案中建议的修复。
但关于你的排序问题。C 标准库有一个(或多个,具体取决于版本)例程用于对任何类型的数组进行排序。最常见的是qsort(3)
. 问题是您必须为例程提供一个可用于比较数组元素的函数。因此,您需要一种将字符及其出现次数存储在一起的方法,并且需要编写该比较函数。
我建议采纳@jack 的评论并使用一系列结构。每个结构都类似于:
struct letter {
char character;
int count;
};
Run Code Online (Sandbox Code Playgroud)
对字符及其出现次数进行分组。然后分配一个数组,每个字母一个(而不是像int[]
现在这样)。
struct letter letters[26];
for (int i = 0; i < 26; i++) {
letters[i] = (struct letter){ (char)(i + 'a'), 0 };
}
Run Code Online (Sandbox Code Playgroud)
在循环搜索从用户检索到的行时,letter.count
每次看到相应字母时更新该字段。
然后,您可以使用标准库qsort(3)
函数按字母数组中的计数对字母数组进行排序。要使用该函数,您需要一个比较函数,它告诉库两个元素的顺序(更大或更少)。
比较函数必须具有签名:int (*compar)(const void *, const void *)
。指向数组void*
中的各个元素letters
,因此您需要将它们转换为struct letter
并比较其中的计数。它可能看起来像这样(未经测试):
int letter_cmp(const void* first, const void* second) {
struct letter* first_letter = (struct letter *) first;
struct letter* second_letter = (struct letter*) second;
if (first_letter->count == second_letter->count) {
return 0;
} else if (first_letter->count < second_letter->count) {
return -1;
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
qort(3)
然后,您可以按如下方式调用该函数。
qsort(&letters[0], sizeof(letters), sizeof(struct letter), &letter_cmp);
Run Code Online (Sandbox Code Playgroud)
第一个参数是数组的开头。第二个是数组的大小(以元素为单位)。第三个是每个元素的大小,第四个是比较函数。
该调用返回后,letters
数组已按递增顺序排序count
。因此,letters[0].character
为您提供最低 的字符count
,并letters[25].character
给出最高(出现次数最多)的字符。
归档时间: |
|
查看次数: |
110 次 |
最近记录: |