使用qSort对字符串进行排序

use*_*444 2 c++ qsort

根据这个网站

http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/
Run Code Online (Sandbox Code Playgroud)

我做了以下程序,对字符串进行排序

#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char list[5][4]={"dat","mai","lik","mar","ana"};
int main(int argc, char *argv[])
{
    int x;
    puts("sortirebamde:");
     for (x=0;x>sizeof(list)/sizeof(char);x++)
     printf("%s\n",list[x]);
      qsort(&list,(sizeof(list)/sizeof(char)),sizeof(list[0]),strcmp);
    system("PAUSE");
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误

13 C:\Documents and Settings\LIBRARY\Desktop\string_sortireba.cpp invalid conversion from `int (*)(const char*, const char*)' to `int (*)(const void*, const void*)' 
13 C:\Documents and Settings\LIBRARY\Desktop\string_sortireba.cpp   initializing argument 4 of `void qsort(void*, size_t, size_t, int (*)(const void*, const void*))' 
Run Code Online (Sandbox Code Playgroud)

请帮忙

Jer*_*fin 11

请注意:将C字符串存储在二维char数组中是不常见的.拥有它更为正常char *ary[],例如argv.该类型不能直接使用排序qsortstrcmp,因为快速排序将通过char **char *比较函数.这对效率有好处,指针可以交换而不是整个字符串.qsortLinux联机帮助页有一些具有正确比较功能的良好示例代码.

您不能strcmp直接传递给qsort它的比较函数,因为qsort希望将指针传递给void,其中strcmp需要指向const char的指针.鉴于指向void的指针和指向char的指针之间所需的相似性,您可以使用强制转换(对于您的代码)来执行此操作,但更简洁的方法是编写采用正确类型的函数:

int cmpstr(void const *a, void const *b) { 
    char const *aa = (char const *)a;
    char const *bb = (char const *)b;

    return strcmp(aa, bb);
}
Run Code Online (Sandbox Code Playgroud)

但是,请注意,在C++中,您通常希望使用std::sort而不是qsort,并且可能使用std::string而不是char *,在哪种情况下,排序变得更简单(并且通常也更快).

  • @SamWatkins:让我说清楚。你投反对票是因为我回答了他提出的问题,而不是告诉他如何做一些与他问的几乎(但不完全)完全不同的事情? (3认同)