• ベストアンサー

コマンドライン引数

下記のリストの結果は自分の期待では「真」なのですが 「偽」となります。 なぜなのかわけが分からなくなって質問させて頂きまし た。 (なお後尾の2行はチェックするために入れただけです。) どなたかご教示願えませんでしょうか。 よろしくお願いします。 リスト #include <iostream> using namespace std; int main(int argc, char *argv[]) { if( argv[1] == "yes") { cout << "真です。" << endl; } else { cout << "偽です。" << endl; } cout << " argv[1] は " << argv[1] << " です。" << endl; cout << " argv[2] は " << argv[2] << " です。" << endl; }

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

  • ベストアンサー
回答No.3

こんにちは。 やりたいことは凄く解かります。 問題の比較の部分ですが argv[1] == "yes" とすると、文字列の比較ではなくて アドレスの比較になるんです。 argv[1]が指すアドレスと "yes"文字列のアドレスは 当然異なりますので 結果、偽となります。 文字列の比較を行いたいのであれば 文字列として比較してあげてください。 具体的にはstrcmp関数などがあります。 HELPで調べたりネットで検索したらサンプルが出てくるかと。 if ( strcmp(argv[1],"yes")==0 ) コンパイルして動作確認していませんが たぶんこんな感じになると思います。 がんばってください。

noname#22589
質問者

お礼

とんでもない誤解をしていまして申し訳ありません。 argv[1] の格納されている番地と、"yes" が格納され ている番地が 違う事にどうして気がつかなかったのか 反省しています。 おかげで良く分かるようになりました。 どうもありがとうございました。

noname#22589
質問者

補足

早速のご教示ありがとうございます。 どうやらとんでもない迷路に入り込んでいたようですが、一つ疑問があります。 >argv[1]が指すアドレスと >"yes"文字列のアドレスは >当然異なりますので の部分が良く分かりません。 char *p = argv[1]; cout << "argv[1] は " << &p << " です。" << endl; cout << "argv[1] の中身は " << *(&p) << " です。" << endl; の3行を追加して結果を見ますと良く分からなくなってきます。 そこで、アドレス(本来、0x43fb00a3 というような表現のもの)と ”yes"(アスキーコードに変換したとしても 0x43fb00a3 とはことなることがはっきりしていると思いますが)とを比較していた、だから等しくない、ということになったという解釈なら分かりやすいのですが、、、、。 つまり 本来、0x43fb00a3 というようなアドレスを cout で表示させる時に、アドレスそのものではなく、アドレスの中身を表示するようになっているということなのでしょうか? 言い替えますと、アドレスを表示しなさい、とすれば 0x43fb00a3 のように表示されるのならすんなりと理解できるのですが、そうではなく、アドレスそのものを表示させるためには、あるいは、アドレスそのものとして取り扱うようにするためには & 演算子を冠しないとダメだと言う事、そのような仕様になっていると言う事なのでしょうか? 長くなってしまいましたがどうぞよろしくお願いします。

その他の回答 (3)

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.4

デバッガ使うとわかりますよ。 argv[1]って言うのは引数1のアドレス。 "yes"はyesが入ってるローカルなメモリのアドレスなんです。 アドレスとアドレスを比較するのは、このプログラムが意図する事と違いますよね。

noname#22589
質問者

お礼

ご教示ありがとうございました。 頭の中が思い込みで混乱していました。 argv[1] は ○○○ 番地に、 "yes" は ××× 番地に、 別個にかくのうされているということですね。 良く分かりました。 どうもありがとうございました。

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.2

あと、比較の仕方が悪いです。strcmp()等で文字列はチェックするんです。

noname#22589
質問者

お礼

早速のご教示、どうもありがとうございました。

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.1

過去のプログラムなり、何か調べりゃ、まず argcの数チェックしてませんか? いきなり、argvの最初[0]以外チェックしてプログラムが落ちても文句言えません。

関連するQ&A