-2

私は文字列の配列を持っています。残念ながら、文字列配列内の各文字列のサイズは一定ではないため、これを行うことはできません。

qsort(fileList, noOfFiles, sizeof(*fileList), compare); 

カスタム比較関数を作成します。代替案は何ですか?

fileList はファイル名のリストです。次のように宣言されています。char **fileList;

私がこれを行うことができない理由は、coz qsort がブラインド関数のようなものだからです。次の要素を見つけるために、前述の (3 番目の引数) メモリ ユニットをスキップするだけです。やみくもに。可変長文字列を使用すると、ランダムな動作になります。qsort で文字列の開始と終了のメモリ位置を特定する方法がないためです。

qsort は char *array[100] に使用できます。

多くの人から要求されたバグのあるコードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int compare(const void *string1, const void *string2){

    char *a = (char*)(string1);
    char *b = (char*)(string2);
    printf("comparing %s     AND    %s\n", a, b);
    return strcasecmp(a,b);
}


void sortListName(char **fileList, int noOfFiles){
    printf("Sorting\n");
    qsort(fileList, noOfFiles, sizeof(char*), compare); 
    return;
}
4

3 に答える 3

3

要素の数がわかっている場合は、各文字列が同じサイズかどうかに関係なく並べ替えることができます。

比較を次のように定義します。

    int compare(const void *a,const void *b)
    {
      const char *astr = (char*)a;
      const char *bstr = (char*)b;    
      return strcmp(astr,bstr);
    }
于 2013-08-23T00:01:13.853 に答える
3

正しい実装は次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int compare(const void* v1, const void* v2){

    const char* a = *(char**)v1;
    const char* b = *(char**)v2;
    printf("comparing %s     AND    %s\n", a, b);
    return strcasecmp(a,b);
}


void sortListName(char** fileList, int noOfFiles){
    printf("Sorting\n");
    qsort(fileList, noOfFiles, sizeof(*fileList), compare); 
}

int main(void){
    char** fileList = malloc(3 * sizeof *filelist);

    fileList[0] = "Hello";
    fileList[1] = "World";
    fileList[2] = "forever";
    sortListName(fileList, 3);
    return 0;
}
于 2013-08-23T01:13:14.297 に答える