1

我已经有一个从文本文件读入的字符串列表到一个名为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”开头的字符串

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

4

4 回答 4

2

您想使用该qsort()功能。

qsort(base, num_of_elements, element_size, my_compare);

比较函数my_compare接受两个参数,每个参数 a const void *,并返回一个数字,指示参数的相对顺序。负数表示第一个参数在第二个参数之前。正数表示第一个参数在第二个参数之后。如果参数比较相等,则返回零。

由于您的字符串比较不区分大小写,因此您需要创建自己的比较函数,或者查找系统提供的不属于 C 库的一部分的比较函数。POSIX 提供strcasecmp()了这个目的(谷歌告诉我这_stricmp()在 Windows 上可用)。

int my_compare (const void *a, const void *b) {
    return strcasecmp(a, b);
}

定义比较函数通常是使用qsort(). 您必须了解传递给该函数的指针的上下文。当一个数组TYPE被传入时qsort(),它将传递一个指向const TYPE比较函数每个参数的指针。

在您的情况下,您将传入一个MAX_CHAR_LEN chars 数组的数组。因此,比较函数的每个参数都是指向MAX_CHAR_LEN chars 的 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()对于您的二维数组就足够了。

于 2013-07-19T23:23:32.727 回答
1

您可以使用该qsort功能进行排序。您还需要创建一个比较两个字符数组的比较函数,然后将该函数指针作为参数传递。

对整数进行排序的示例:

/* 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;
}

上面的代码可以很容易地适应对字符数组而不是整数进行排序。

于 2013-07-19T23:17:13.253 回答
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]);
    }
}
于 2013-07-19T23:17:52.020 回答
0

qsort是不错的选择。在这里查看它的详细信息

您也可以尝试冒泡排序。它在 C 中的实现很容易 - 请参阅这个很好的答案以获得帮助

于 2013-07-19T23:20:40.577 回答