2012-08-24 40 views
2

通過試驗和錯誤,我設法得到下面的字符串比較函數以按照我的意圖使用qsort(),但我不太明白爲什麼(const char *)強制轉換表達式中需要星號。可有人請剖析和解釋: -(const char *)的解釋和解釋在此字符串比較函數中投射C

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

附錄: -

void findStrings(int * optionStats, char strings[][MAX_STRING_SIZE + 1], int numStrings) 
{ 
    qsort(strings, numStrings, 21*sizeof(char), strCompare); 
} 

是否有消除調用strcmp()的通過strCompare(),只是使用的strcmp()作爲參數的方法改爲qsort()?

+0

我相信,'MAX_STRING_SIZE + 1 == 21'否則,你說謊你的編譯器和編譯器當你對他們說謊的時候容易得到他們自己的回報。你可能會更好地使用相同的符號來表示這個值。 –

+0

請注意,如果您要對指向char的指針數組進行排序,則需要使用不同的字符串比較例程:'int cmpStrings(const void * a,const void * b){char * a1 = *(char **)a; char * b1 = *(char **)b;返回strcmp(a1,b1); }'。 –

+0

是MAX_STRING_SIZE + 1 == 21,在調試後將替換21。該功能似乎排序正確,但我會嘗試你的變化出於好奇。 –

回答

3

,因爲你想一個指針轉換爲const void指針const char你需要一個星號和一個星號表示,他們是指針類型。

事實上,您並不需要轉換,因爲pointer to void類型可以隱式轉換爲C語言中的pointer to T類型,而C++不是這種情況。

+0

有一些很好的解釋,但這似乎很好地回答了原來的問題。 –

1

strcmp的簽名(還有另外一個,但是這是你正在使用的一個):

int strcmp(const char *s1, const char *s2); 

所以,爲你的函數(ab)的參數是const void,你必須執行這些演員。

只要您在調用qsort時用作參數的變量將作爲char *傳遞給strCompare,這將是正確的。

+0

這就是我以爲但編譯器抱怨警告:從不兼容的指針類型[默認啓用]傳遞'qsort'的參數4 –

+0

你是對的,這就是原因。我將編輯我的答案,刪除我最後一個問題。 –

+0

@nhahtdh這是我做的第一件事,但我得到了警告:從不兼容的指針類型[默認啓用]傳遞'qsort'的參數4。有什麼我失蹤? –

0

由於

int strcmp(
    const char *string1, 
    const char *string2 
); 

定義那樣。如果你不把它轉換爲「const char *」,那麼變量「a」應該是指向void的類型指針。它的更好,如果你鍵入

const void *a as const void* a

the asterisk is associated with the data-type.

所以投全變量「a」爲指針數據類型「爲const char」的,你必須使用星號太明白。

1

由於這裏已經有人提到過,你不需要定義一個新的函數,只需要指定指針類型。這裏是你如何能投功能而它傳遞給qsort,防止任何警告/錯誤:

qsort(arr, 
     sizeof(arr)/sizeof(char*), 
     sizeof(char*), 
     (int(*)(const void *, const void *))strcmp); 
+1

好了,現在我明白了爲什麼我不需要在一個單獨的函數中將它包裝在strcmp()中。我會標記這個答案。 Thankyou –

+0

嚴格來說,函數指針強制轉換不是定義良好的行爲。在實踐中,只要調用約定和參數大小相同,它們幾乎總是可以工作的。當然,@倫丁, – Lundin

+0

!然而,演員背後的要點是告訴編譯器,你知道你在做什麼。** – behnam