• ベストアンサー

argvのNULLチェック

argvの値がNULLかどうかチェックしたいのですが 記述は以下で合っていますでしょうか? int main(int argc, char *argv[]){ /* パラメタのNULLチェック */ if(strcmp(argv[1] == NULL) = 0){ printf(argv[1]はNULLです); } *********************************** 上記の比較のように、argv[1] == NULL で出来ますか? argv[1] == '\0' でしょうか? }

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

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

> ↑間違ってますか? 間違っています。 argv[n]がNULLになるのは、argv[argc]だけです。 5個のパラメータが正しく入力されたかどうかを知るのであれば、 if (argc == (5 + 1)) とします。 argv[0]にはプログラム名が格納されます。また、環境によってはargcが0になることもありますので、その場合はargv[0]がNULLになります。 argv[argc + 1]以降は配列の外になりますので、その内容を参照することはできません。

その他の回答 (3)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> if (argv[1] == NULL) > if (argv[2] == NULL) > if (argv[3] == NULL) > if (argv[4] == NULL) > if (argv[5] == NULL) > とやれば、それぞれNULLかどうかのチェックできると > いう事ですね! 一応はそうですが、たぶん何か誤解があると思います。 具体的に何をしたいのか補足してください。

goo393
質問者

補足

やりたい事は、シェルから渡されてくる5個の パラメタを使って、Cモジュールで処理を行うのですが 変数に格納する前に、パラメタチェックを行ってから (シェル側でもチェックしてる)宣言した変数にコピーして使いたいのです。 if (argv[1] == NULL){ /* パラメタのNULLチェック */ strcpy(atr1, argv[1]); /* 変数にコピーする */ } ↑間違ってますか?

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

argv はプログラム名を含めたコマンドライン引数の配列へのポインタを保持しているので、NULL にはなりません。 argv[1] は(もしあれば)コマンドライン引数の文字列の先頭を指しているので、'\0' にはなりません。 argv[1] が NULL ということはプログラムが、引数なしで実行されたということです。 strcmp(argv[1] == NULL) は明らかに不正な呼び出しです。strcmp の関数宣言を確認して下さい。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

> 記述は以下で合っていますでしょうか? 間違っています。 argvの値がNULLかどうかをチェックするのであれば、 if (argv == NULL) です。ただし、argvがNULLになるのは、(再帰呼出しを行うなど)自分でmainを呼び出した場合のみです。 argv[1]がNULLかどうかをチェックするのであれば、 if (argv[1] == NULL) です。

goo393
質問者

補足

パラメタの数が5コあって、それぞれの値がNULLか どうかチェックするのであれば、jactaさんが 教えてくれたように if (argv[1] == NULL) if (argv[2] == NULL) if (argv[3] == NULL) if (argv[4] == NULL) if (argv[5] == NULL) とやれば、それぞれNULLかどうかのチェックできると いう事ですね! ありがとうございます。

関連するQ&A