2011-05-17 59 views
0

这是我做了我的比较函数传递给快速排序():的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的顺序,而不是其他方式?

+1

'sizeof(char)'是**总是** 1! – paxdiablo 2011-05-17 03:37:16

回答

4

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

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; 
} 
0

如果您的初始缓冲区开始时填充了一个普通的C字符串(最后只有一个空终止符),并且您希望它以这种方式结束,那么您可以排除排序中的最后一个位置:

qsort(buffer, strlen(buffer), 1, charCompare); 
相关问题