2017-08-31 115 views
2

我有指針數組以字符串:c char字符的qsort爲字符串

char *TAB[3] = { "dafafa", "alfkasf", "bafgr" }; 

我想在每個這些字符串的字符進行排序。

我比較功能:

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

,並同時對其中的一個嘗試快速排序:

qsort(TAB[0], 6, sizeof(char), cmp); 

程序不起作用。 經過很多努力,我發現問題的原因是在提供TAB[0]qsort()

任何人都可以解釋爲什麼它不工作,以及如何解決?

+6

C中的字符串是*只讀*。嘗試修改它們會導致[*未定義行爲*](https://en.wikipedia.org/wiki/Undefined_behavior)。 –

+0

「我想對每個字符串中的字符進行排序。」 - >在給定源字符串寫入的情況下,您希望將該排序字符串放在哪裏,_string literal_,是_undefined behavior_? – chux

回答

4

如果您想對每個字符串中的字符進行排序,您必須確保的第一件事是您的字符串可以寫入。就目前來看,你的字符串是隻讀的,所以你不能將它們的字符排序,而不把它們的內容複製到允許寫入的內存中。

接下來的事情是你需要一個循環。由於您要分別對每個字符串進行排序,因此您需要遍歷數組,並在每個項目上調用qsort。初始項目爲TAB[i],長度爲strlen(TAB[i])。你的cmp功能將起作用。

+0

你怎麼知道這些字符串是隻讀的?你能告訴我可以解決這個問題的代碼示例嗎? 我檢查過後,聲明'char tab [] =「dafafa」'而不是'char * tab =「dafafa」'它工作。那裏有什麼區別? –

+3

@PiotrWitkoś所有字符串文字都是隻讀的,因爲您不允許更改其內容。 'char tab [] =「dafafa」'是不同的,因爲你用一個字符串文字初始化一個字符數組。這個數組變得可寫。原始代碼中的TAB [3]是一個指針數組,所以它非常像'char * tab =「dafafa」'重複三次。你可以查看[這裏](https://ideone.com/1eqKyG),看看如何正確複製字符串。 – dasblinkenlight

+0

我在考試中有一個問題,要對字符串'TAB [100]''中的每個字符串中的字符進行排序。你如何聲明它以避免複製內容? –