1. ホーム
  2. c++

[解決済み] qSortを使った文字列のソート

2022-02-14 01:41:01

質問

これによると サイト 私は、文字列をソートする以下のプログラムを作成しました。

#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;
}

以下は、私が受け取ったエラーです。

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*))' 

ご協力お願いします

解決方法を教えてください。

注意:C言語の文字列を2次元のchar配列に格納するのは珍しいことです。 通常は char *ary[] argvのような。 この型は qsortstrcmp というのは、qsort は char ** ない char * を比較関数に追加します。 これは効率的で、文字列全体ではなく、ポインタを交換することができます。 そのため qsort の Linux マニュアルページ には、正しい比較関数を使った良いサンプルコードがあります。

を渡すことはできません。 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);
}

ただし、C++では通常 std::sort の代わりに qsort を使用し、おそらく std::string の代わりに char * この場合、ソートはよりシンプルになります(そして一般的に速くなります)。