web-dev-qa-db-ja.com

Int argc、char * argv []はどういう意味ですか?

多くのC++ IDEやコンパイラでは、メイン関数を生成すると、次のようになります。

int main(int argc, char *argv[])

IDEなしでC++をコーディングするときに、コマンドラインコンパイラだけを使うと、次のように入力します。

int main()

パラメータなし。これはどういう意味ですか、それは私のプログラムにとって不可欠ですか?

455
Greg Treleaven

argvargcは、CおよびC++でコマンドライン引数をmain()に渡す方法です。

argcargvが指す文字列の数になります。事実上すべての実装はプログラム名を配列の前に付けるので、これは(実際には)1に引数の数を加えたものになります。

変数は慣例でargc argument count )とargv argument vector )と名付けられていますが、任意の有効な識別子を与えることができます。int main(int num_args, char** arg_strings)も同様に有効です。

コマンドライン引数を処理するつもりがない場合は、それらを完全に省略してint main()を生成することもできます。

次のプログラムを試してください。

#include <iostream>

int main(int argc, char** argv) {
    std::cout << "Have " << argc << " arguments:" << std::endl;
    for (int i = 0; i < argc; ++i) {
        std::cout << argv[i] << std::endl;
    }
}

./test a1 b2 c3を付けて実行すると出力されます。

Have 4 arguments:
./test
a1
b2
c3
587
meagar

argcはコマンドラインからプログラムに渡される引数の数、argvは引数の配列です。

あなたは引数の数を知っている引数をループすることができます:

for(int i = 0; i < argc; i++)
{
    // argv[i] is the argument at index i
}
49
John Boker

このようにしてプログラムを実行するとします(sh構文を使用)。

myprog arg1 arg2 'arg 3'

Mainをint main(int argc, char *argv[])として宣言した場合、(ほとんどの環境で)、main()は以下のように呼び出されます。

p = { "myprog", "arg1", "arg2", "arg 3", NULL };
exit(main(4, p));

ただし、mainをint main()と宣言した場合は、次のようになります。

exit(main());

引数が渡されません。

注意すべき2つの追加事項

  1. これらはmainに対する唯一の2つの標準的な強制署名です。特定のプラットフォームが追加の引数または異なる戻り型を受け入れる場合、それは拡張機能であり、移植性のあるプログラムでは信頼できません。
  2. *argv[]**argvはまったく同じなので、int main(int argc, char *argv[])int main(int argc, char **argv)と書くことができます。
17
Toby Speight

mainのパラメータは、プログラムの起動時にプログラムに提供されたコマンドラインパラメータを表します。 argcパラメータはコマンドライン引数の数を表し、char *argv[]はコマンドラインで提供される個々の引数を表す文字列(文字ポインタ)の配列です。

8
BlueMonkMN

main関数は、argcargvの2つのパラメータを持つことができます。 argcは整数(int)パラメータであり、プログラムに渡される引数の数です。

プログラム名は常に最初の引数であるため、プログラムには少なくとも1つの引数があり、argcの最小値は1になります。しかし、プログラムが2つの引数を持つ場合、argcの値は3になります。

パラメータargvは文字列配列を指し、 引数vector と呼ばれます。これは関数引数の1次元文字列配列です。

5
moshtagh

最初のパラメータは与えられた引数の数で、2番目のパラメータはそれらの引数を表す文字列のリストです。

4
Nick Gerakines
int main();

これは単純な宣言です。コマンドライン引数を取ることはできません。

int main(int argc, char* argv[]);

この宣言は、プログラムがコマンドライン引数を取る必要があるときに使用されます。このように実行すると

myprogram arg1 arg2 arg3

argcまたはArgument Countは4(4つの引数)に設定され、argvまたはArgument Vectorsには "myprogram"、 "arg1"、 "arg2"、および "arg3"への文字列ポインタが移入されます。 プログラム呼び出し(myprogram)が引数に含まれています。

代わりに、あなたは使用することができます:

int main(int argc, char** argv);

これも有効です。

追加できるパラメーターがもう1つあります。

int main (int argc, char *argv[], char *envp[])

envpパラメータには環境変数も含まれています。各エントリは次の形式に従います。

VARIABLENAME=VariableValue

このような:

Shell=/bin/bash    

環境変数リストはnullで終了します。

重要: system()の呼び出しには、argvまたはenvpの値を直接使用しないでください。悪意のあるユーザーが環境変数をコマンドラインコマンドに設定し、(潜在的に)大きな被害をもたらす可能性があるため、これは 巨大な セキュリティホールです。一般的に、system()を使わないでください。ほとんどの場合、Cライブラリを介して実装されたより優れたソリューションがあります。

4
Adrian Zhang

両方の

int main(int argc, char *argv[]);
int main();

cまたはC++プログラムのエントリポイントの法的な定義です。 Stroustrup:C++のスタイルとテクニックFAQ /あなたのメイン関数に対して可能な、あるいは合法的なバリエーションのいくつかを詳述します。

1
Chris Becke