gpt4 book ai didi

c - 如何按字母顺序对字符串数组(二维数组)进行排序?

转载 作者:太空宇宙 更新时间:2023-11-04 02:08:31 25 4
gpt4 key购买 nike

我已经有一个字符串列表,从一个文本文件读入一个名为 word 的二维数组,准备好进行排序。

列表如下:

I
like
cherry
pie
and
chocolate
pie

我希望列表在排序后看起来像这样:

and
cherry
chocolate
I
like
pie
pie

函数原型(prototype)如下。 int counter 是字符串的数量,MAX_CHAR_LEN = 1024 如果您想知道的话。

void alphabetize(char word[][MAX_CHAR_LEN], int counter)
{

return;
}

请注意,仅按第一个字符排序是不够的,因为列表包含两个以“ch”开头的字符串

有人可以提供可以做到这一点的功能吗?提前致谢。

最佳答案

您想使用 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 的常量数组的指针。这意味着从技术上讲,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 并不真正支持常量数组 的概念。它将这样的东西转换成一个常量数组,因此需要转换来反射(reflect)这一点。

但是,数组的地址等于其第一个元素的地址。也就是说,对于上面的代码,以下断言为真:

    assert(aa == (const void *)*aa);
assert(bb == (const void *)*bb);

因此,因为指向数组的指针的取消引用等于同一数组的衰减地址值,所以 my_compare() 的第一个实现对于您的二维数组就足够了。

关于c - 如何按字母顺序对字符串数组(二维数组)进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17756866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com