C 将字符串与qsort进行比较

C 将字符串与qsort进行比较,c,C,我想从一个文件中读取n个字符串并按字母顺序排序 以下是我的代码版本: #include <stdio.h> #include <stdlib.h> #include <string.h> char **citireMatrice(int *n) { char c; char sep[] = " ,./;:'[]{}|`~!@#$%^&*()\n"; char **

我想从一个文件中读取n个字符串并按字母顺序排序 以下是我的代码版本:

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

    char **citireMatrice(int *n)
    {
        char c;
        char sep[] = " ,./;:'[]{}|`~!@#$%^&*()\n";
        char **x=NULL;
        char **aloca=NULL;
        char *valoca=NULL;
        int citireCaracterNormal=0;
        int lungime=0;
        FILE *f = fopen("date.in","r");

    x = (char **)malloc(1*sizeof(char *));
    *n = 1;
    *(x+(*n)-1) = NULL;
    while((c = fgetc(f))!=EOF)
    {
        if(strchr(sep,c))
        {
            if(citireCaracterNormal)
            {
                lungime++;  //adaug '\0' la sfarsit-ul cuvantului
                valoca = (char *)realloc(*(x+(*n)-1),lungime*sizeof(char));
                if(valoca == NULL)
                {
                    printf("Eroare de alocare a memoriei!");
                    exit(1);
                }
                *(x+(*n)-1) = valoca;
                *(*(x + (*n)-1) + lungime -1) = '\0';
                lungime = 0;

                (*n)++;
                aloca = (char **)realloc(x,(*n)*sizeof(char*));
                if(aloca == NULL)
                {
                    printf("Eroare de alocare a memoriei!");
                    exit(1);
                }
                x = aloca;
                *(x+(*n)-1) = NULL;

                citireCaracterNormal = 0;
            }
        }
        else
        {
            lungime++;
            valoca = (char *)realloc(*(x+(*n)-1),lungime*sizeof(char));
            if(valoca == NULL)
            {
                printf("Eroare de alocare a memoriei!");
                exit(1);
            }
            *(x+(*n)-1) = valoca;
            *(*(x + (*n)-1) + lungime - 1) = c;

            citireCaracterNormal = 1;
        }
    }
    (*n)--;
    fclose(f);
    return x;
}

void afisare(char **x,int n)
{
    int i;
    for(i=0;i<n;i++)
        printf("%s\n",*(x+i));
}

int predicat(const void *a,const void *b)
{
    return -strcmp((char *)a,(char *)b);
}

int main()
{
    int n;
    char **x = citireMatrice(&n);
    afisare(x,n);
    qsort(x,n,sizeof(char *),predicat);
    printf("\n\nDupa sortare:\n\n");
    afisare(x,n);
    return 0;
}
#包括
#包括
#包括
字符**citireMatrice(int*n)
{
字符c;
字符sep[]=”,./;:“[]{}| `~!@$%^&*()\n”;
char**x=NULL;
char**aloca=NULL;
char*valoca=NULL;
int citirecracternormal=0;
int lungime=0;
文件*f=fopen(“date.in”,“r”);
x=(char**)malloc(1*sizeof(char*);
*n=1;
*(x+(*n)-1)=空;
而((c=fgetc(f))!=EOF)
{
若有(strchr(9月,c))
{
if(花旗信用评级标准)
{
lungime++;//adaug'\0'la sfarsit ul cuvantului
valoca=(char*)realloc(*(x+(*n)-1),lungime*sizeof(char));
if(valoca==NULL)
{
printf(“爱的回忆!”);
出口(1);
}
*(x+(*n)-1)=瓦洛卡;
*(*(x+(*n)-1)+lungime-1)='\0';
肺组织=0;
(*n)++;
aloca=(char**)realloc(x,(*n)*sizeof(char*);
如果(aloca==NULL)
{
printf(“爱的回忆!”);
出口(1);
}
x=阿洛卡;
*(x+(*n)-1)=空;
citirecracternormal=0;
}
}
其他的
{
lungime++;
valoca=(char*)realloc(*(x+(*n)-1),lungime*sizeof(char));
if(valoca==NULL)
{
printf(“爱的回忆!”);
出口(1);
}
*(x+(*n)-1)=瓦洛卡;
*(*(x+(*n)-1)+肺组织-1)=c;
citirecracternormal=1;
}
}
(*n)--;
fclose(f);
返回x;
}
无效afisare(字符**x,整数n)
{
int i;

对于(i=0;i传递给
qsort
predict
)的函数,将指针带到要比较的每个元素

由于要排序的内容是
char*
,因此将传递函数
char**

我认为你应该这样重写:

int predicat(const void* a, const void* b)
{
    char* pStrA = *(char**)a;
    char* pStrB = *(char**)b;

    printf("Comparing %s to %s\n", pStrA, pStrB); // To verify you have the right strings.

    return -strcmp(pStrA, pStrB);
}

predict
的参数不是
char const*
。它们是
char const**
。您需要使用:

int predicat(const void *a,const void *b)
{   
    return -strcmp(*(char const**)a, *(char const**)b);
}
另外,通过使用

    return -strcmp(*(char const**)a, *(char const**)b);
您将按相反的顺序对它们进行排序。我不知道您是否打算这样做。如果不是,请使用

    return strcmp(*(char const**)a, *(char const**)b);