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