2017-08-31 9 views
2

を文字列に私は、文字列へのポインタの配列を持っている:Cのcharのqsortのポインタの配列で

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

私はこれらの文字列のそれぞれでの文字を並べ替えしたいと思います。プログラムが動作しません

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

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

及びこれらのいずれかのqsortをしようとしているとき:

コンペア機能マイ。 多くの努力の結果、この問題の理由はTAB[0]qsort()に届けていることがわかりました。

誰もそれがうまくいかない理由とそれを修正する方法を説明できますか?

+6

Cのリテラル文字列は*読み込み専用*です。それらを変更しようとすると、[*未定義の動作*](https://en.wikipedia.org/wiki/Undefined_behavior)につながります。 –

+0

"文字列ごとに文字を並べ替えたい - >と、ソートされた文字列をどこに置きたいのですか?ソース文字列への書き込み、_stringリテラル_は_undefined behavior_ですか? – chux

答えて

4

各文字列内の文字を並べ替える場合は、最初に文字列を書き込むことができなければなりません。現在のところ、あなたの文字列は読み込み専用なので、書き込むことができるメモリに内容をコピーせずに文字を並べ替えることはできません。

次は、ループが必要です。各文字列を個別にソートするので、配列をループして各項目にqsortを呼び出す必要があります。最初の項目はTAB[i]で、長さはstrlen(TAB[i])です。 cmp機能が動作します。

+0

これらの文字列が読み取り専用であることをどのように知っていますか?それを修正できるコード例を私に示してもらえますか? 'char * tab =" dafafa "の代わりに' char tab [] = "daf​​afa" 'を宣言したのを確認しました。違いは何ですか? –

+3

@PiotrWitkośすべての文字列リテラルは、内容を変更することができないという意味で、読み取り専用です。 'char tab [] =" dafafa "'は文字列のリテラルで文字の配列を初期化するため、異なっています。この配列は書き込み可能になります。元のコードの 'TAB [3]'はポインタの配列なので、 'char * tab =" dafafa "'が3回繰り返されるのと非常によく似ています。 [here](https://ideone.com/1eqKyG)で文字列を正しくコピーする方法を確認できます。 – dasblinkenlight

+0

私の試験で、文字列 'TAB [100]'の各文字列の文字を並べ替えるための質問があります。あなたはコンテンツをコピーしないように宣言しますか? –

関連する問題