101

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

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

意味がわかりません。プログラムでこれらの引数を使用しない場合、これらの引数を使用する理由を誰かが説明できれば、とてもうれしいです。だけではない理由: int main()?

プログラムの名前は の要素の 1 つであり、*argv[]引数argcの数のカウント*argv[]ですか? に送信される他の引数は何*argv[]ですか? それらをどのように送信しますか?

4

8 に答える 8

125

引数argcargvofmainは、引数をプログラムに送信する方法として使用されます。おそらく最もよく知られている方法は、ユーザーが入力できる古き良き端末を使用することcat fileです。ここでの単語catは、ファイルを取得して標準出力 ( stdout) に出力するプログラムです。

プログラムは で引数の数と で引数argcのベクトルを受け取りますargv。上記では、引数の数は2 で (プログラム名は最初の引数としてカウントされます)、引数のベクトルには [ , , null ]が含まれます。最後の要素がヌルポインターである間。catfile

通常、次のように記述します。

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、次のように -functionを記述しても同じように有効です。

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あります。関数の引数リストにはさらにバリエーションがありますが、非標準であるため、ここでは詳しく説明しません。main

また、変数の命名は慣例であり、実際の意味はありません。他の人を混乱させないようにこれに従うことは常に良い考えですが、次のように定義することも同様に有効ですmain

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

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

于 2010-10-09T22:09:35.697 に答える
67

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

$ 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() (リンク)]

于 2010-10-09T21:58:40.827 に答える
16

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

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

ただしint main(void)、C のプロトタイプとして使用することもできます。

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


資力:

于 2010-10-09T21:56:30.237 に答える
3

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

于 2010-10-09T21:57:29.987 に答える
1

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

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

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

于 2010-10-09T21:59:15.957 に答える
1

comp.lang.c FAQは、質問を扱っています

「main() の正しい宣言は何ですか?」
質問11.12aで。

于 2010-10-09T22:06:51.773 に答える
0

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

これにより、プログラムに渡された引数に反応するオプションが与えられます。何も期待していない場合は、 を使用することもできますint main

于 2010-10-09T21:55:49.880 に答える
0

などのパラメーターを使用してアプリケーションを実行できますapp -something -somethingelseint argcこれらのパラメーターの数を表しchar *argv[]、アプリケーションに渡される実際のパラメーターを含む配列です。このようにして、アプリケーション内でそれらを操作できます。

于 2010-10-09T21:59:59.760 に答える