- ベストアンサー
strcmpでの &
#include<stdio.h> #include<string.h> int main(void){ char data[10],sort; int i,j; printf("10文字入力してください。\n"); for(i=0;i<=10;i++){ data[i]=fgetc(stdin); /*---挿入ソート---*/ sort=data[i]; j=i-1; while((strcmp(data[j],sort) > 0) && (j>=0)){/*ここでstrcmp(&data[j],&sort)にするとできるんですが。*/ data[j+1]=data[j]; j--; } data[j+1]=sort; } for(i=0;i<=10;i++){ fputc(data[i],stdout); } return(0); } 何故& を入れるだけでエラーが出なくなるのかわかりません。 アドレスを比べて何故大小が出るのか… よろしくおねがいします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
strcmp(data[j], とした場合は、strcmpの第一引数に、char型のデータを渡しています。strcmpは第一引数にchar *型(即ち、メモリのアドレス=ポインター)を要求します。 strcmp(&data[j] とすると、data[j]のアドレスを渡したことになります。
その他の回答 (2)
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
No.1 の方の回答にもありますが、むしろ、 if (data[i] > sort) ... が正解です。 strcmp(&data[i], &sort) だと、data[i] から始まる文字列と、sort から始まる文字列を比較してしまいます。 ※だから、data[i+1] や、sort の次にたまたまはいっているゴミも、比較対象になってしまいます。 入力された文字の中に、同じ文字があると、おかしなことになります。 ※逆に、全部の文字が異なれば、最初の文字の比較で結果が出ますから、バグは表面化しませんが。
お礼
>strcmp(&data[i], &sort) だと、data[i] から始まる文字列と、sort から始まる文字列を比較してしまいます。 なるほど~!ただ、今回は1文字ずつなんでなんとかなったみたいです。ありがとうございました。
- Chronos198
- ベストアンサー率30% (105/349)
strcmp()関数はそもそも文字列の比較に使用する関数です。 よって、その引数は当然ポインタ(アドレス)であり、 実行しているのは「渡されたポインタから始まる文字列同士の比較」です。 これで足りますかね・・? ちなみに、キャラクタのソートをしたいのであれば、 ((strcmp(data[j],sort) > 0) ではなく ( data[j] > sort ) と直に比較してしまって構わないかと。
お礼
>( data[j] > sort ) と直に比較してしまって構わないかと。 ですね。 こっち使わせてもらいます。 ありがとうございました。
お礼
>strcmpは第一引数にchar *型(即ち、メモリのアドレス=ポインター)を要求します。 完全に抜けてました^^; ありがとうございました。