c - 排序字符串数组

标签 c arrays sorting

我正在使用 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'

最佳答案

您正在使用另一个项目并且可能在数组边界之外访问

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

应该是

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

有一个reference在关于使用 qsortstrcmp 的 C-FAQ 中:

:我正在尝试使用 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 的指针的指针)并取消引用,生成 char * 可以传递给 strcmp。

对 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 健康与安全部20.5 页第419章

关于c - 排序字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36306329/

相关文章:

Javascript - 为什么我的应用程序认为这个数组是空的?

c++ - 当相应字符不在同一位置时字符串的所有排列

c++ - 如何确定线程模拟级别

c - 使用 cblas_sgemm 执行复杂的矩阵操作以进行乘法

javascript - 最小化具有重复值 Javascript 的数组

Python:如何在数字初级排序中执行二级降序字母排序

c - 为什么这两种计算字数的方法有很大不同?

c++ - C++代码中的错误指针错误

php - 如何根据唯一且预定的顺序而不是 asc 或 desc 对 mysql 数据库中的数据进行排序

Scala 动态列表排序