web-dev-qa-db-ja.com

main(int argc、char * argv [])について

重複の可能性があります:
main()の引数は何ですか?
int argc、char * argv []とはどういう意味ですか?

すべてのプログラムはmain(int argc, char *argv[])定義から始まります。

意味がわからないプログラムでこれらの引数を使用しない場合に、なぜこれらの引数を使用するのかを誰かが説明できればとてもうれしいですか。なぜint main()だけじゃないの?

プログラムの名前は*argv[]の要素の1つで、argc*argv[]の引数の数のカウントですか? *argv[]に送られる他の引数は何ですか?どうやって送るの?

88
Fahad Uddin

argcの引数argvおよびmainは、プログラムに引数を送る方法として使用されます。おそらく最も一般的な方法は、ユーザーが入力できる場所で古き良き端末を使用することです。 cat file。ここでWord catはファイルを受け取り、それを標準出力(stdout)に出力するプログラムです。

プログラムはargcの引数の数とargvの引数のベクトルを受け取ります。上記では、arg ument c ountは2になります(プログラム名は最初のものとして数えられます)。引数)とarg ument v ectorは[catfilenull]を含みます。最後の要素はnullポインタです。

一般的には、このように書くでしょう:

int  // Specifies that type of variable the function returns.
     // main() must return an integer
main ( int argc, char **argv ) {
     // code
     return 0; // Indicates that everything went well.
}

プログラムが引数を必要としない場合は、以下のようにmain-関数を書くことも同様に有効です。

int main() {
  // code
  return 0; // Zero indicates success, while any 
  // Non-Zero value indicates a failure/error
}

C言語の初期のバージョンでは、暗黙のとおり、intの前にmainはありませんでした。今日、これはエラーと見なされています。

POSIX - 準拠システム(およびWindows)では、プログラムのベクトルを含む3番目のパラメーターchar **envpを使用する可能性があります env ironment変数main関数の引数リストには他にもさまざまなバリエーションがありますが、非標準なのでここでは詳しく説明しません。

また、変数の命名はの規則であり、実際の意味はありません。あなたが他の人を混乱させないようにこれを守ることは常に良い考えですが、mainを次のように定義することは等しく有効です。

int main(int c, char **v, char **e) {
   // code
   return 0;
}

そしてあなたの2番目の質問のために、プログラムに引数を送るいくつかの方法があります。 POSIX - 標準である exec*()ファミリーの関数 を見てみることをお勧めしますが、おそらくそれは簡単というだけです。 use system("command arg1 arg2")が、すべてのシステムで動作することが保証されていないため、system()の使用は通常眉をひそめます。私は自分でテストしたことはありません。しかし、bashzsh、または* NIXシステムにインストールされている他のシェルがない場合、system()は失敗します。

112
Frank

これらは、プログラムが呼び出されたときに、たとえばコマンドラインからプログラムに引数を渡すためのものです。

$ gcc mysort.c -o mysort

$ mysort 2 8 9 1 4 5

上記では、プログラムmysortがいくつかのコマンドラインパラメータで実行されています。 main( int argc, char * argv[])の中では、これは

Argument Count, argc = 7 

7つの引数があるので(プログラムを数える)

Argument Vector, argv[] = { "mysort", "2", "8", "9", "1", "4", "5" };

以下は完全な例です。

$ cat mysort.c
#include <stdio.h>
int main( int argc, char * argv [] ) {
    printf( "argc = %d\n", argc );
    for( int i = 0; i < argc; ++i ) {
        printf( "argv[ %d ] = %s\n", i, argv[ i ] );
    }
}

$ gcc mysort.c -o mysort

$ ./mysort 2 8 9 1 4 5
argc = 7
argv[ 0 ] = ./mysort
argv[ 1 ] = 2
argv[ 2 ] = 8
argv[ 3 ] = 9
argv[ 4 ] = 1
argv[ 5 ] = 4
argv[ 6 ] = 5

[charの文字列 "2"、 "8"などは、文字から数字への変換関数を使って数字に変換することができます。 atol()(link )]

56
Arun

argc(引数の数)およびargv(引数のベクトル)を使用すると、アプリケーションの起動時に渡された引数の数と値を取得できます。

この方法では、アプリケーションの起動時にパラメータ(-versionなど)を使用して別の方法で動作させることができます。

しかし、Cのプロトタイプとしてint main(void)を使うこともできます。

3番目の引数(envp)を持つ3番目の(あまり知られていない、非標準の)プロトタイプがあります。環境変数が含まれています。


リソース:

14
Colin Hebert

argcは、プログラムに渡される引数の数を意味します。 char* argv[]は渡された引数です。 argv[0]は常にプログラム名そのものです。 100%確信があるわけではありませんが、int main()はC/C++で有効であると思います。

3
kraftan

argcは実行時にプログラムに与えられるコマンドライン引数の数です。そしてargvはこれらの引数を含む文字配列の配列(むしろC文字列の配列)です。あなたがコマンドライン引数を必要としないことを知っているなら、代わりにvoid引数を取ることであなたのmainを宣言することができます:

int main(void) {
    /* ... */ 
}

これらは標準に従ってmainに定義されている2つのプロトタイプだけですが、一部のコンパイラではvoidの戻り型も許可されています。これについての詳細 ウィキペディア上

1
You

argcはコマンドライン引数の数、argvはコマンドライン引数を表す文字列の配列です。

これにより、プログラムに渡された引数に反応することができます。何も期待していないのなら、int mainを使うこともできます。

0
Aliostad

app -something -somethingelseなどのパラメータを使用してアプリケーションを実行できます。 int argcはこれらのパラメータの数を表し、char *argv[]は実際のパラメータがアプリケーションに渡される配列です。このようにして、あなたはあなたのアプリケーションの中で彼らと働くことができます。

0
Ondrej Slinták