2011-05-17 56 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); 
相關問題