2015-10-19 44 views
1

我正在學習使用C的qsort()對字符數組0123h進行排序。 qsort()返回後,我打印出我的s,但我只有不可讀的字符。我認爲我的compare()是正確的,因爲所有的qsort()需要用它來確定* a是否在before/equal/after * b之後。有沒有人有一個想法是什麼導致行printf("After: %s\n", s);不工作?謝謝。在C中使用qsort()後得到奇怪的字符感到困惑0

int compare(const void * a, const void * b){ 
    return *(char*)a - *(char*)b; 
} 
void doWork(char* s) { 
    printf("Before: %s\n", s); 
    qsort(s, strlen(s), sizeof(char *), compare); 
    printf("After: %s\n", s); 
} 

回答

5
qsort(s, strlen(s), sizeof(char *), compare); 

你似乎在這裏告訴qsort,你選的類型是char*而非char。除非你的指針是完全相同的大小與你的角色一樣,這不會有好下場的:-)

您應該使用:

qsort(s, strlen(s), sizeof(char), compare); 

,或者因爲sizeof(char)總是1,你可以得到廢除:

qsort(s, strlen(s), 1, compare); 

雖然,最大限度地減少代碼更改的利益,你應該需要改變在未來的類型,你可以使用變量,而不是直接類型:

qsort(s, strlen(s), sizeof(*s), compare); 

與任何這些變化:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int compare(const void * a, const void * b){ 
    return *(char*)a - *(char*)b; 
} 

void doWork(char* s) { 
    printf("Before: %s\n", s); 
    qsort(s, strlen(s), sizeof(*s), compare); 
    printf("After: %s\n", s); 
} 

int main (void) { 
    char s[] = "atlantic"; 
    doWork(s); 
    return 0; 
} 

你會看到你要找的輸出:

Before: atlantic 
After: aacilntt 
+2

'的sizeof * s'將是另一種選擇,可能是有用的,如果代碼被後來適合'wchar_t'串 –

+0

好一點,@ M.M補充說,作爲另一種選擇。 – paxdiablo

1

問題是要傳遞給sizeof(char*)qsort其中sizeof(char)是合適的。

使用

qsort(s, strlen(s), sizeof(char), compare); 
2

s元素不是類型char *所以他們沒有sizeof (char *),使用sizeof (char)代替。

qsort(s, strlen(s), sizeof(char), compare);