【问题标题】:Sorting string arrays对字符串数组进行排序
【发布时间】:2016-07-18 07:24:46
【问题描述】:

我正在使用 C 做一个包含数组的学校项目。目前我正在尝试按字母顺序对字符串数组进行排序。我似乎无法成功地做到这一点。这是我到目前为止所做的简化代码:

void sort_string_array(char **table)
{
    int i = 0;
    while (table[i++] != NULL);                // to get the length
    qsort(table, i, sizeof(char *), strcmp);   // sorting
}

这是一个完全错误的解决方案风格,我关闭了吗,有什么问题:P?任何帮助都会很棒!

编辑:

void sort_string_array(char **table)
{
    int i = 0;
    while (table[i] != NULL) i++;              // to get the length
    qsort(table, i, sizeof(char *), strcmp);   // sorting
}

更正该错误后,它仍然无法正常运行。使用字符串 {'one','two','three','four'} 这种排序的第一个值应该是 'four' 但它是 'two'}

【问题讨论】:

标签: c arrays sorting


【解决方案1】:

您正在使用另外一项并且可能在数组范围之外访问

while (table[i++] != NULL);  

应该是

while (table[i] != NULL) i++;  

C-FAQ 中有一个reference 是关于使用qsortstrcmp

Q:我正在尝试使用 qsort 对字符串数组进行排序,使用 strcmp 作为比较函数,但它不起作用。

A:字符串数组可能是指指向 char 的指针数组。 qsort 比较函数的参数是指向被排序对象的指针,在本例中,是指向 char 的指针。然而,strcmp 接受指向 char 的简单指针。所以不能直接使用strcmp。像这样写一个中间比较函数:

/* compare strings via pointers */
int pstrcmp(const void *p1, const void *p2)
{
    return strcmp(*(char * const *)p1, *(char * const *)p2);
}

比较函数的参数表示为通用指针,const void *。它们被转换回它们真正的样子(指向 char 的指针)并取消引用,产生可以传递给 strcmp 的 char *。

对 qsort 的调用可能看起来像

#include <stdlib.h>
char *strings[NSTRINGS];
int nstrings;
/* nstrings cells of strings[] are to be sorted */
qsort(strings, nstrings, sizeof(char *), pstrcmp);

(不要被 K&R2 Sec. 5.11 pp. 119-20 中的讨论误导,该讨论没有讨论标准库的 qsort,并且对 char * 和 void * 的等价做了一个安静的、不必要的假设)。

有关 qsort 比较函数的更多信息——如何调用它们以及如何声明它们——请参阅问题 13.9。

参考:ISO Sec. 7.10.5.2 H&S秒。 20.5 页。第419章

【讨论】:

  • 天哪,我犯了一个多么愚蠢的错误,非常感谢:)
猜你喜欢
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
相关资源
最近更新 更多