2015-05-22 57 views
0

我想使用qsort排序單個字符串中的字符。它似乎沒有工作。這是我的代碼。qsort()函數C

int compare_function (const void* a, const void* b) 
{ 
    char f = *((char*)a); 
    char s = *((char*)b); 
    if (f > s) return 1; 
    if (f < s) return -1; 
    return 0; 
} 

int main(int argc, char* argv[]) 
{ 
    char* str= argv[1]; 
    /* Originally missing the +1 */ 
    char* sorted_str = malloc((strlen(str) + 1)*sizeof(char)); 
    memcpy(sorted_str, str, strlen(str) + 1); 

    qsort(sorted_str, sizeof(str)/sizeof(char), sizeof(char), compare_function); 

    printf("%s\n", sorted_str); // Originally str 
    free(sorted_str); 
    return 0; 
} 

輸出是?。我需要做些什麼來解決這個問題?

+1

這裏很多失誤。正如對答案的評論中指出的那樣,當爲已排序的字符串分配內存時,您不會考慮NULL終止。由於sizeof(str)/ sizeof(char)的大小是錯誤的,str是一個字符指針,所以它的大小隻是存儲指針地址的字節數。你從來沒有檢查過你是否有足夠的論據通過......你確定你通過了一個論點,它是在正確的位置? – Ben

+2

請注意,更改代碼並不完全公平,以便有效指出其中一個問題的答案不再相關。您可以註釋已修改的代碼(正如我爲您所做的那樣),也可以保留原始代碼並添加修改後的代碼。 –

+0

@JonathanLeffler我會記住這一點。 – Jumper

回答

2

的第二個參數qsort是不對的。

qsort (sorted_str, 
     sizeof(str)/sizeof(char), // sizeof(str) is size of a pointer. 
     sizeof(char), 
     compare_function); 

您需要:

qsort (sorted_str, 
     strlen(str), 
     sizeof(char), 
     compare_function); 
+0

工作就像一陣微風 – Jumper

+0

恨它,當我錯過那樣的明顯的東西。祝你好運! :) –

4

您正在打印您的輸入,而不是排序結果。注意行:

printf("%s\n",str); 

應該

printf("%s\n",sorted_str); 
+0

我做了這個改變,真是愚蠢的我。但現在它根本沒有產出。 – Jumper

+0

你可能需要增加一個字符的內存初始分配/副本,以允許空終止符,儘管你真的不把它當作字符串處理 - 只是一個字符數組...... –

+0

做到了,現在變成了一個?作爲輸出。可悲的是我甚至無法讓gdb在我的Mac上工作,因此無法調試。 – Jumper