qsort () работает в одном направлении, но не в другом - PullRequest
0 голосов
/ 17 мая 2011

Вот как я сделал свою функцию сравнения для передачи в qsort ():

int charCompare(const void* ptr1, const void* ptr2)
{
   char c1 = *(char*)ptr1;
   char c2 = *(char*)ptr2;
   return c1 - c2;
}

И это реализация:

char buffer[SIZE];
/*
 * buffer filled here
 */
qsort(buffer, sizeof(buffer)/sizeof(char), sizeof(char), charCompare);
printf("%s", buffer);

Ничего не печатается.Я почти уверен, что это потому, что нулевые символы идут перед обычными символами, поскольку он работает по-другому (если я возвращаю c2-c1 вместо charCompare).Но как мне избавиться от нулевых символов, поскольку я хочу, чтобы они были в порядке от a до z, а не наоборот?

Ответы [ 3 ]

4 голосов
/ 17 мая 2011

Вы абсолютно правы в том, что в него включены нулевые значения. Вы сортируете весь буфер, а не только ту часть, которая содержит вашу строку с нулевым символом в конце. Вам нужно использовать strlen(buffer) вместо sizeof(buffer) (и, конечно, включать string.h). Вам также не нужно делить на sizeof(char), поскольку функция sizeof определяется в единицах размера char.

0 голосов
/ 17 мая 2011

Если ваш начальный буфер начинается с обычной строки C, которая имеет только один нулевой терминатор в конце, и вы хотите, чтобы он заканчивался таким образом, тогда вы можете просто исключить последнее место из сортировки:

qsort(buffer, strlen(buffer), 1, charCompare);
0 голосов
/ 17 мая 2011

Если у вас есть буфер, содержащий символы «\ 0», и вы хотите, чтобы они не заканчивались в начале буфера, просто убедитесь, что '\0' сортирует по концу массива:

int charCompare(const void* ptr1, const void* ptr2)
{
   int c1 = *(char*)ptr1;
   int c2 = *(char*)ptr2;

   if (c1 == 0) c1 = INT_MAX;
   if (c2 == 0) c2 = INT_MAX;

   return c1 - c2;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...