我已经有一个从文本文件读入的字符串列表到一个名为word
的二维数组中,准备好进行排序。
列表如下:
I
like
cherry
pie
and
chocolate
pie
我希望列表在排序后显示如下:
and
cherry
chocolate
I
like
pie
pie
功能原型如下。 int counter
是字符串的数量,MAX_CHAR_LEN = 1024
以防您想知道。
void alphabetize(char word[][MAX_CHAR_LEN], int counter)
{
return;
}
请注意,仅按第一个字符排序是不够的,因为列表包含两个以“ch”开头的字符串
有人可以提供可以执行此操作的功能吗?提前谢谢。
答案 0 :(得分:2)
您想使用qsort()
功能。
qsort(base, num_of_elements, element_size, my_compare);
比较函数my_compare
接受两个参数,每个参数为const void *
,并返回一个数字,表示参数的相对顺序。负数表示第一个参数在第二个参数之前。正数表示第一个参数在第二个参数之后。如果参数比较相等,则返回零。
由于您的字符串比较不区分大小写,您需要创建自己的比较函数,或者找到系统提供的不属于C库的函数。 POSIX为此目的提供strcasecmp()
(Google告诉我,_stricmp()
在Windows上可用。)
int my_compare (const void *a, const void *b) {
return strcasecmp(a, b);
}
定义比较函数通常是使用qsort()
最棘手的部分。您必须了解传递给该函数的指针的上下文。当TYPE
的数组传递到qsort()
时,它会将指向const TYPE
的指针传递给比较函数的每个参数。
在您的情况下,您将传入一组MAX_CHAR_LEN
char
的数组。因此,比较函数的每个参数都是指向MAX_CHAR_LEN
char
s的const数组的指针。这意味着从技术上讲,my_compare
函数应该这样写:
int my_compare (const void *a, const void *b) {
typedef char TYPE[MAX_CHAR_LEN];
const TYPE *aa = (const TYPE *)a;
const TYPE *bb = (const TYPE *)b;
return strcasecmp(*aa, *bb);
}
通常不需要对参数进行强制转换,除了C实际上不支持常量数组的概念。它将这样的东西转换为常量数组,因此需要强制转换才能反映出来。
但是,数组的地址等于其第一个元素的地址。也就是说,对于上面的代码,以下断言都是正确的:
assert(aa == (const void *)*aa);
assert(bb == (const void *)*bb);
因此,因为指向数组的指针取消引用等于同一数组的衰减地址值,my_compare()
的第一个实现就足以用于2-D数组。
答案 1 :(得分:1)
您可以使用qsort
功能进行排序。您还需要创建一个比较两个字符数组的比较函数,然后将该函数指针作为参数传递。
对ints进行排序的示例:
/* qsort example */
#include <stdio.h> /* printf */
#include <stdlib.h> /* qsort */
int values[] = { 40, 10, 100, 90, 20, 25 };
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int main ()
{
int n;
qsort (values, 6, sizeof(int), compare);
for (n=0; n<6; n++)
printf ("%d ",values[n]);
return 0;
}
上面的代码很容易适用于对字符数组进行排序而不是整数。
答案 2 :(得分:0)
如果你想编写自己的排序函数,这样的事情非常简单。
for (int i = 0; i < array.size(); i++)
{
for (int j = i+1; j < array.size(); j++)
{
if (array[i] > array[j])
swap(array[i],array[j]);
}
}
答案 3 :(得分:0)
qsort
是不错的选择。查看详细信息here
您也可以尝试Bubble Sort。它在C中的实现很简单 - 请参阅Good answer获取帮助