对字符串中的字符进行排序(下面对字符串进行排序)
根据注释,您可以像在 C 中对任何其他 type 进行排序一样对字符串进行排序。您可以使用标准库提供的 qsort 函数,也可以使用您自己的函数(例如气泡排序、堆排序等)
使用qsort 时,您唯一的任务是编写一个compare 函数以传递给qsort 函数,该函数告诉qsort 如何对您的数据进行排序。 qsort 的基本声明是:
void qsort (void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
qsort 接受 4 个参数:(1) 指向要排序的列表/数组的指针,(2) 要排序的元素数量,(3) 每个元素的 类型大小 (例如sizeof int)和(4)最后一个指向您的比较函数的指针。注意:您的 compare 函数将 2 个通用指针(void 类型)作为其输入。
对于字符排序,您正确地认识到您将按 ascii 值进行排序。因此,您的比较函数需要做的就是返回两个字符中的哪一个:(a) 一个大于另一个,或者 (b) 它们相等。
compare 函数的示例如下:
int compare_char (const void *a, const void *b) {
if (*(char *)a != *(char *)b)
return *(char *)a - *(char *)b;
return 0;
}
通常,对于新的 C 程序员来说,唯一困难的部分是弄清楚如何将参数的 void 类型转换为您需要比较的类型。
在compare 函数中,由于您传递了一个指向类型void 的指针,因此您需要将其转换为您的类型,然后才能取消引用它以获取指针地址处的值.在这里将void * 转换为char * 就是您所需要的。然后在进行比较之前,您需要使用 '*' 取消引用它。 (对于例如*(char *)a 的最终转换/取消引用)。将它们放在一个简短的示例中:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXS 32
/* simple compare function for qsort, returns
less than 0 if char 'b' is larger than char 'a',
a positiver number if 'a' is larger than 'b', and
zero if they are equal (note: you can return
'b' - 'a' to sort in reverse order.)
*/
int compare_char (const void *a, const void *b) {
if (*(char *)a != *(char *)b)
return *(char *)a - *(char *)b;
return 0;
}
int main (void) {
char word[MAXS] = {0};
char sorted[MAXS] = {0};
printf ("\n Enter a string: "); /* read word from stdin */
if (!scanf ("%31[^\n]%*c", word)) {
printf (" [ctrl+d] received\n\n");
return 1;
}
/* copy word to sorted before sort */
strncpy (sorted, word, sizeof word);
/* sort the chars in sorted[] */
qsort (sorted, strlen (word), sizeof *word, compare_char);
/* print results */
printf ("\n word : %s\n sorted : %s\n\n", word, sorted);
return 0;
}
编译
$ gcc -Wall -Wextra -Ofast -o bin/str_sort_char str_sort_char.c
使用/输出
$ ./bin/str_sort_char
Enter a string: aghibw
word : aghibw
sorted : abghiw
对字符串数组进行排序
上面所有关于按char 排序的解释,也适用于对字符串数组进行排序。这还可以很好地了解您使用qsort 的方式。在上面的第一个示例中,当我们使用qsort 进行处理时,我们必须回答这个问题:“我在对type 进行排序吗?” 上面我们将每个char 排序为null -终止的字符数组(或string)。
字符串是如何引用的? 通过一个指向字符串开始字符的指针。所以在这里,我们不是在 字符数组 中对每个 char 进行排序,而是在字符串数组中排序 strings (或者正确地一个数组char * 类型的指针)就qsort 而言,唯一的区别是compare 函数(和输入......)。我们需要对字符串进行排序,所以compare 函数必须提供一种比较字符串的方法。在 C 中,标准的字符串比较函数是 strcmp(或 strncmp 以限制比较的字符数)。
例如,使用strcmp 对字符串数组进行排序,您将使用类似于:
/* string compare function */
int compare_strings (const void *a, const void *b) {
return strcmp(*(char **)a, *(char **)b);
}
如果您查看compare_strings 中的比较,您只是返回了strcmp 函数的结果。基本上,只需更改比较函数(和输入),您就可以使用qsort 对字符串数组进行排序,如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* string compare function */
int compare_strings (const void *a, const void *b) {
return strcmp(*(char **)a, *(char **)b);
}
int main (void) {
char *strings[] = {"Baba", "Cece" , "Caca" , "Zaza" , "Lala"};
size_t i;
/* sort strings */
qsort (strings, sizeof strings/sizeof *strings,
sizeof *strings, compare_strings);
/* output sorted arrray of strings */
for (i = 0; i < sizeof strings/sizeof *strings; i++)
printf (" strings[%2zu] : %s\n", i, strings[i]);
return 0;
}
输出
$ ./bin/qsort_strings_static
strings[ 0] : Baba
strings[ 1] : Caca
strings[ 2] : Cece
strings[ 3] : Lala
strings[ 4] : Zaza