这就是我将比较函数传递给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的顺序,而不是相反?
答案 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);