2017-04-04 45 views
-2

我想通過qsort排序名稱數組。qsort不工作c程序

這是我的代碼

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

int myCompare (const void * a, const void * b) { 

return *(char*)a - *(char*)b; 
} 


int main(void) { 

int i; 
char fileArr[] = {"inputbv", "inputa","inputzef",}; 

int stringLen = sizeof(fileArr)/sizeof(char *); 

qsort(fileArr, stringLen, sizeof(char *), myCompare); 

for (i=0; i<stringLen; ++i) 
    printf("%d: %s\n", i, fileArr[i]); 
} 

此代碼不會在最後打印出任何東西。它只是結束,因此它看起來像它刪除字符數組

+4

打開警告。這個代碼中有兩個*直接*表示根本問題。 – WhozCraig

+2

在比較函數中需要'strcmp'。比較這些指針最多可以使它們反轉或保持不變。 –

+0

'int myCompare(const void * a,const void * b)'接收數組元素的地址。數組元素[應該是](http://stackoverflow.com/a/43215634/2410359)'char *',所以'myCompare()'中的'a'應該轉換爲'char **'。 – chux

回答

0

第一關中的條目,你錯過了一個*

char *fileArr[] = {"inputbv", "inputa","inputzef",}; 

這並不能解釋爲什麼你不正確排序,這是一個不同的問題,但它確實解釋你爲什麼沒有輸出。 (一個驗證編譯器,如gcc -Wall,如果沒有那顆缺少的星號,就會告訴你該聲明是無效的。)

雖然這裏還有一些其他問題。首先,作爲評論者的一個暗示,該myCompare()函數聲明爲正確的類型,但它並不完全做你認爲它的作用:

int myCompare(const void *a, const void *b) 
{ 
    ... 
} 

這是因爲qsort()經過地址到每一塊數據,而不是數據塊本身。這種情況下的數據塊是指向字符數組的指針,因此qsort()將傳遞指向您的比較函數的指針。那裏不是單一的星星;他們實際上是兩個星星變相。其次,比較指針你不行:指針幾乎是按照定義,是隨機值。你比較功能,如寫的,即使你糾正它,都應該在那裏的*的數量,仍然是錯誤的:

/* Don't do this. */ 
return *(char **)a - *(char **)b; 

這是字面上更多或更少「通過隨機排序這些字符串在記憶中的位置「,這根本無助於你將它們排列整齊。

正確的做法是不添加另一顆星(寫作**(char **)a - **(char **)b字面意思是「比較第一個字符對方」)。做正確的事情就是調用strcmp()兩個字符串詞法比較:

int myCompare(const void *a, const void *b) 
{ 
    return strcmp(*(char **)a, *(char **)b); 
} 

這是你應該使用什麼。

+0

不是我的DV,而是你自己說的:不是一個答案,而是一個非常好的評論。 –

+0

我回答了他的具體問題:「此代碼不打印任何內容。」如果他想知道爲什麼'qsort()'沒有做到他所期望的那樣,那完全是另一回事。 (有趣的是,請注意,他並沒有真正比較指針,就像您在評論中提到的那樣;他按照第一個字符排序,這些字符都是相同的:除非他有足夠的幸運在引擎蓋下進行穩定排序,否則他的代碼可能更隨機比即使按指針排序!) –

+0

有沒有問題,但標題是關於'qsort',並且您的評論可能已經在您的答案。 –