Ordinamento delle corde assegnate dinamicamente
Domanda
Ho un problema strano:
int cmp(const void *a, const void *b) {
const char *ia = (const char *) a;
const char *ib = (const char *) b;
return strcmp(ia, ib);
}
char ** names = NULL;
if((names = (char **) calloc(3,sizeof(char*))) == NULL)
{
fprintf(stderr,"Unable to allocate the memory");
return 1;
}
.
...
names[0] = "c";
names[1] = "b";
names[2] = "a";
printf("before\n");
printf("%s\n",names[0]);
printf("%s\n",names[1]);
printf("%s\n",names[2]);
qsort(names,3,sizeof(char *),cmp);
printf("after\n");
printf("%s\n",names[0]);
printf("%s\n",names[1]);
printf("%s\n",names[2]);
.
dà come previsto:
before
c
b
a
after
a
b
c
.
ma
names[0] = (char *) calloc(1024,sizeof(char));
names[1] = (char *) calloc(1024,sizeof(char));
names[2] = (char *) calloc(1024,sizeof(char));
scanf("%s",names[0]);
scanf("%s",names[1]);
scanf("%s",names[2]);
printf("before\n");
printf("%s\n",names[0]);
printf("%s\n",names[1]);
printf("%s\n",names[2]);
qsort(names,3,sizeof(char *),cmp);
printf("after\n");
printf("%s\n",names[0]);
printf("%s\n",names[1]);
printf("%s\n",names[2]);
.
dà
before
c
b
a
after
b
a
c
.
Perché le stringhe non sono ordinate correttamente?
Soluzione
Your comparison function receives the address of the item in the array. You need to dereference that to get the pointer in the array:
int cmp(const void *a, const void *b) {
const char *ia = *(const char **) a;
const char *ib = *(const char **) b;
return strcmp(ia, ib);
}
Altri suggerimenti
The qsort comparator function's arguments are pointers to the arguments being compared. I think you need an additional dereference. In other words, a and b are not char*, they are char**.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow