• ベストアンサー

コマンドライン引数

下記のリストの結果は自分の期待では「真」なのですが 「偽」となります。 なぜなのかわけが分からなくなって質問させて頂きまし た。 (なお後尾の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; }

noname#22589
noname#22589

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

  • ベストアンサー
回答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

  • コマンドラインから引数を渡したいのですが・・・

    VC.NETで参考書に載っていた下のようなコードを書きました。 #include <iostream> #include <cstdlib> using namespace std; int main (int argc, char *argv[]) { int sum; if (argc != 3) { cout << "引数の個数が違います。"; return 1; } sum = atoi (argv[1]) + atoi (argv[2]); cout << "合計=" << sum << '\n'; return 0; } しかしながら、引数の個数が違います。としか出力されません。どうすればよろしいでしょうか?

  • プログラムの動作の仕方

    この下のプログラムは、WRITE <ファイル名>をコマンド行で入力すると、動作するプログラムなのですが、この通りにWRITE <test>としてもできません。 やり方を教えてください. #include <iostream> #include <fstream> using namespace std; int main(int argc,char *argv[]) { if(argc!=2){ cout << "使い方:WRITE<ファイル名>" << endl; return 1; } ofstream out(argv[1]); //出力ファイル if(!out){ cout << "出力ファイルが開けません" << endl; return 1; } char str[80]; cout << "文字列をディスクに書き込み、$で停止します" << endl; do{ cout << ": "; cin >> str; out << str << endl; }while(*str!='$'); out.close(); return 0; } お願いします。

  • C++でEXEを作成してCGI-BINで動作させてますが、ブラウザからの入力を受ける方法がわからん

    自前のEXEでTESTとブラウザに表示させることに成功しました =========-- #include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { cout << "Content-type: text/plain" << endl; cout << endl; cout << "test" << endl; return 0; } ==============--- さて、POSTメソッドで受けた内容や、ウラウザの種類やREFERなどはどうやってEXEで取得するのかがわかりません。教えてください。

    • ベストアンサー
    • CGI
  • C++のifstreamの使い方

    C++のifstreamの使い方で分からない所があるので、分かる方御教示ください。 下記は、C++で読み込んだファイルの中身が空だった場合を無理やり例外処理を使って書いてみたのですが、中身が存在する場合、たとえば、 line1 line2 line3 ではline1を無限に繰り返してしまいます。(1)を ifstream instream = inStream(argv[1]); while (instream >> input) にするとうまくいくようなのですが、この違いがよくわかりません。 違いを教えてください。 #include <iostream> #include <string> #include <fstream> using namespace std; ifstream inStream(char *str); int main(int argc, char *argv[]) { if (argc < 2) cout << "ファイル名を指定してください" << endl; else { try { string input; while (inStream(argv[1]) >> input) // (1) cout << input << endl; } catch (int i) { cerr << argv[1] << "を開けません" << endl; } } return 0; } ifstream inStream(char *str) { ifstream inStream(str); if (!inStream) throw 1; return inStream; }

  • プログラムの説明

    C++の初心者です。 ↓のプログラムの動作はさっぱりわかりませんが、それについての説明は具体的に教えていただきたいです。(できれば、詳しく) #include <iostream> #include <string> int getNinzu(int ARGC, char *ARGV[]) throw (char const *){ if(ARGC!=2){ throw "Needs only one argument."; } int ninzu=std::atoi(ARGV[1]); if(ninzu<=0){ throw "Value is too small."; } return ninzu; } #include <cstdlib> #include <ctime> int randfive(){ static bool firsttime=true; if(firsttime){ firsttime=false; std::srand(std::time(NULL)); } return static_cast<int>(static_cast<double>(std::rand())/RAND_MAX*(5+1)); } #include <iomanip> int main(int ARGC, char* ARGV[]){ std::string cmdname=ARGV[0]; int ninzu; try{ ninzu=getNinzu(ARGC,ARGV); std::cout << std::setfill('0'); for (int i = 1; i <= ninzu; ++i) { int score = 0; for (int k = 0; k < 20; ++k) score += randfive(); std::cout << "C" << std::setw(5) << i << " " << score << '\n'; } }catch(char const *str){ std::cerr << str << std::endl << "Usage: " << cmdname << " ninzu" << std::endl; return 1; } }

  • バックグラウンドでの処理

    C言語のカテゴリで質問しようか迷いましたが動きはシェル関連なので質問させてください. 例えば,以下のようなCソースがあったとします. 1 #include<iostream> 2 3 int main(int argc, char *argv[]) 4 { 5 6 for (int i = 0;; i++) { 7 8 std::cout << "0" << std::endl; 9 } 10 11 return 0; 12 } 実行ファイル名を0として ./0 & としましたが,0が連続的に出力されるだけでした. バックグラウンドで処理させているはずなのになぜ0が出力されるのでしょうか?

  • 【C++】関数ポインタの使い方

    関数ポインタの使い方で悩んでいます。 下記の (1)のようにグローバルメソッドとして定義したメソッドを関数ポインタに代入することは出来るのですが、 (2)のようにクラスのメンバメソッドとして定義したメソッドは関数ポインタに代入することは出来ませんでした。 Error:バインドされた関数へのポインターは関数の呼び出しにのみ使用できます。 というエラーが発生します。 関数ポインタに外部参照でメソッドを代入することは出来ないのでしょうか? -----(1)------------------------------------------------------------------ #include "stdafx.h" #include <iostream> using namespace std; int f(int a, int b){ return a * b; } int _tmain(int argc, _TCHAR* argv[]) { typedef int (* FUNC_POINTER)(int, int); FUNC_POINTER fp; fp = f; cout << fp(1,2) <<endl; getchar(); return 0; } ------------------------------------------------------------------------- -----(2)------------------------------------------------------------------ #include "stdafx.h" #include <iostream> using namespace std; class MPointerList{ public: int f(int a, int b){ return a * b; } }; int _tmain(int argc, _TCHAR* argv[]) { typedef int (* FUNC_POINTER)(int, int); FUNC_POINTER fp; //fp = f; MPointerList mP; fp = mP.f; cout << fp(1,2) <<endl; getchar(); return 0; } -------------------------------------------------------------------------

  • char型変数のアドレスを coutで表示するには

    #include <iostream> using namespace std; int main() { bool b; int i; short s; long l; float f; double d; char c; //上で宣言した変数のアドレスを表示 cout << "bool &b " << &b << endl; cout << "int &i " << &i << endl; cout << "short &s " << &s << endl; cout << "long &l " << &l << endl; cout << "float &f " << &f << endl; cout << "double &d " << &d << endl; cout << "char &c " << &c << endl; //「char &c 」とのみ表示される cout << '\n'; //char型のみ printf で再表示 printf("char &c %p\n", &c); //「char &c ********」と表示される return 0; } 上のプログラムを実行すると cout << "char &c " << &c << endl; のところだけ、アドレスが表示されません。 printfを使えば、char型の変数のアドレスも表示されるのですが…。 coutを使ってchar型のアドレスを表示させるにはどうすればいいのでしょうか。 よろしくお願いします。

  • VC++2010での漢字の引数の取り込みについて

    VC++2010で下記のプログラムでプログラムの実行ファイル名を取りこんでいるのですが、ファイルのパス名に漢字が入ると取り込めない場合があります。 #include "stdafx.h" #include <iostream> using namespace std; #ifdef _UNICODE wostream &_tcout = wcout; typedef wstring tstring; #else ostream &_tcout = cout; typedef string tstring; #endif int _tmain(int argc, _TCHAR* argv[]) { for(int i=0; i<argc; i++) _tcout << "argv[" << i << "] contains " << argv[i] << endl; return 0; } メニューの「プロジェクト」→「~のプロパティ」→「構成プロパティ」→「文字セット」 で、 ここを「マルチバイト文字セットを使用する」に設定して行うと漢字が入ったパスのファイル名もうまく取り込めるのですが、 ここを「Unicode文字セットを使用する」に設定すると漢字がうまく取り込めません。 Unicodeの設定で、漢字も取り込めるようなコードの書き方とか、VS2010の設定方法などがあれば教えていただきたいのです。 よろしくお願い致します。

  • 質問です。。。

    いつもすみません。また質問させていただきます。 まずしたのプログラムを見てください・・・ #include <iostream> #include <string> using namespace std; int main() { string name; int tosi; cout << "こんにちは。私はコンピュータです。" <<endl; cout << "あなたの年齢を教えてください" <<endl; cin >> tosi; cout<<name<<"歳なんですか・・・老けてますね(笑)"<<endl; cout << "どこの学校ですか" <<endl; cin >> name; cout<<name<<"That's right!"<<endl; } このプログラムの8行目にあるint tosi;がありますよね。 この単語がなくても string name があったら12行目のプログラムができたのですが、どういうことなのでしょうか? 表現が一部変ですがよろしくお願いします。

専門家に質問してみよう