• ベストアンサー

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); } 何故& を入れるだけでエラーが出なくなるのかわかりません。 アドレスを比べて何故大小が出るのか… よろしくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

strcmp(data[j], とした場合は、strcmpの第一引数に、char型のデータを渡しています。strcmpは第一引数にchar *型(即ち、メモリのアドレス=ポインター)を要求します。 strcmp(&data[j] とすると、data[j]のアドレスを渡したことになります。

newcolleger
質問者

お礼

>strcmpは第一引数にchar *型(即ち、メモリのアドレス=ポインター)を要求します。 完全に抜けてました^^; ありがとうございました。

その他の回答 (2)

回答No.3

No.1 の方の回答にもありますが、むしろ、 if (data[i] > sort) ... が正解です。 strcmp(&data[i], &sort) だと、data[i] から始まる文字列と、sort から始まる文字列を比較してしまいます。 ※だから、data[i+1] や、sort の次にたまたまはいっているゴミも、比較対象になってしまいます。 入力された文字の中に、同じ文字があると、おかしなことになります。 ※逆に、全部の文字が異なれば、最初の文字の比較で結果が出ますから、バグは表面化しませんが。

newcolleger
質問者

お礼

>strcmp(&data[i], &sort) だと、data[i] から始まる文字列と、sort から始まる文字列を比較してしまいます。 なるほど~!ただ、今回は1文字ずつなんでなんとかなったみたいです。ありがとうございました。

回答No.1

strcmp()関数はそもそも文字列の比較に使用する関数です。 よって、その引数は当然ポインタ(アドレス)であり、 実行しているのは「渡されたポインタから始まる文字列同士の比較」です。 これで足りますかね・・? ちなみに、キャラクタのソートをしたいのであれば、 ((strcmp(data[j],sort) > 0) ではなく ( data[j] > sort ) と直に比較してしまって構わないかと。

newcolleger
質問者

お礼

>( data[j] > sort ) と直に比較してしまって構わないかと。 ですね。 こっち使わせてもらいます。 ありがとうございました。

関連するQ&A