私がこれを持っている場合:
int main(int argc, char *argv[])
本文では、 を使用してプログラムを見つけることがありますargv[1]
。
argv[1]
overはいつ使うのargv[0]
ですか?コマンド ラインの2 番目の引数を読み取りたい場合だけですか?
慣例により、argv[0]
は現在のプログラムの名前(またはパス) であり、argv[1]
~argv[argc - 1]
はユーザーが指定するコマンドライン引数です。
ただし、これは必ずしも真実である必要はありません。プログラムは OS 固有の機能を使用してこの要件を回避できます。これは頻繁に発生するため、注意が必要です。(意識していてもできることが多いかどうかはわかりませんが…)
例:
gcc -O3 -o temp.o "My file.c"
次の引数を生成します (生成する必要があります)。
argc: 5
argv: ["gcc", "-O3", "-o", "temp.o", "My file.c"]
つまり、 ではなくをargv[0]
指します。gcc
-O3
argv
はポインターの配列であり、この配列内の各ポインターは、コマンド ラインからの 1 つの引数を格納します。最初の引数 (つまりargv[0]
、実行可能ファイル/プログラム自体)argv[1]
も、2 番目の引数も同様です!
引数の総数は によって決定されargc
ます。
argv[0] はプログラムの実行パス、argv[1] はプログラムの最初のパラメーターです。
C++実行可能ファイルが次のようになっているとします。
/home/user/program
(またはC:\program.exe
Windows の場合)
あなたが実行した場合:
./home/user/program 1 2
(またはC:\program.exe 1 2
Windows の場合)
argv[0] = /home/user/program
( C:\program.exe
)
argv[1] = 1
argv[2] = 2
その理由は次のとおりです。
argv[0]
実行可能ファイルのパスですargv[1]
は第 1 引数です編集:
argv[0]
必ずしも実行可能ファイルのパスではないことがわかりました。
次の SO の質問を読んでください: args[0] は実行パスであることが保証されていますか?
はい、ほとんどそれargv[1]
です。2 番目のコマンド ライン パラメータです。最初のコマンド ライン パラメータは、プログラム自体の名前です。
または、この回答が元々持っていたセマンティックな混乱と他の人からのコメントを避けるために、argv[0] をゼロ番目のパラメーターと呼ぶのが理にかなっているかもしれませんargv[1]
。
exec()
いずれにせよ、これは関数のファミリーに由来します。たとえば、execl
使用法があります。
int execl(const char *path, const char *arg0, ... /*, (char *)0 */);
(Unix) シェルでコマンドを入力すると、必要に応じて、シェルは最初にコマンド名を解決し (を使用して$PATH
)、実際の絶対パスを見つけます。(絶対または相対) パスが に提供されpath
、最初に入力されたコマンドが として提供されarg0
、最終的にargv[0]
プログラムに組み込まれます。
残りのコマンドライン パラメータはargv[1]
、 などになります。
簡単な答えはイエスです。配列には、プログラムに渡されたすべてのオプションが含まれています。
argv[0] はプログラム自体のファイルパスであるため。追加のコマンド ライン パラメーターは、さらにインデックス argv[1]、argv[2] にあります。詳細については、 http ://www.site.uottawa.ca/~lucia/courses/2131-05/labs/Lab3 をご覧ください/CommandLineArguments.html