qsort()在一个方向上工作,但不在其他方向上工作

时间:2011-05-17 03:25:33

标签: c arrays char quicksort

这就是我将比较函数传递给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);

什么都没打印出来。我很确定这是因为空字符在普通字符之前出现,因为它以另一种方式工作(如果我从charCompare返回c2-c1)。但是我怎样才能摆脱空字符,因为我希望它是从a到z的顺序,而不是相反?

3 个答案:

答案 0 :(得分:4)

你是否正确包含了null。您正在排序整个缓冲区,而不仅仅是包含您的(空终止)字符串的部分。您需要使用strlen(buffer)而不是sizeof(buffer)(当然还包括string.h)。您也不需要除sizeof(char),因为sizeof函数是根据char大小单位定义的。

答案 1 :(得分:0)

如果你有一个包含'\ 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;
}

答案 2 :(得分:0)

如果你的初始缓冲区开始时填充了一个普通的C字符串,它在结尾只有一个空终结符,并且你希望它以那种方式结束,那么你可以从排序中排除最后一个点: / p>

qsort(buffer, strlen(buffer), 1, charCompare);