Сортировка динамически размещаемых строк - PullRequest
1 голос
/ 18 февраля 2011

У меня странная проблема:

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]);

Дает, как и ожидалось:

before
c
b
a
after
a
b
c

Но

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]);

дает

before
c
b
a
after
b
a
c

Почему строки сортируются неправильно?

Ответы [ 2 ]

2 голосов
/ 18 февраля 2011

Ваша функция сравнения получает адрес элемента в массиве.Вам нужно разыменовать это, чтобы получить указатель в массиве:

int cmp(const void *a, const void *b) {
   const char *ia = *(const char **) a;
   const char *ib = *(const char **) b;
   return strcmp(ia, ib);
}
2 голосов
/ 18 февраля 2011

Аргументы функции компаратора qsort являются указателями на сравниваемые аргументы.Я думаю, что вам нужно дополнительное разыменование.Другими словами, a и b не char *, они char **.

...