web-dev-qa-db-ja.com

Cのmainの引数

どうすればいいのかわかりません!私はCの基本を深く理解しています。構造、ファイルIO、文字列など。CLA以外のすべて。何らかの理由で、私は概念を把握することができません。提案、ヘルプ、またはアドバイス。 PS私はLinuxユーザーです

58
Anthony

mainの署名は次のとおりです。

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

argcは、渡されたコマンドライン引数の数を示します。これは、ユーザーが起動したプログラムの実際の名前であるincludesです。 argvには、インデックス1から始まる実際の引数が含まれます。インデックス0はプログラム名です。

したがって、次のようにプログラムを実行した場合:

./program hello world

次に:

  • argcは3です。
  • argv [0]は「./program」になります。
  • argv [1]は「hello」になります。
  • argv [2]は「world」になります。
140
cdhowie

Posixシステムでコマンドライン引数を解析するための標準は、ライブラリルーチンのgetopt()ファミリを使用してコマンドライン引数を処理することです。

適切なリファレンスは GNU getopt manual です

9
Toby

このように想像してください

*main() is also a function which is called by something else (like another FunctioN)

*the arguments to it is decided by the FunctioN

*the second argument is an array of strings

*the first argument is a number representing the number of strings

*do something with the strings

たぶん、プログラム例が助けになるでしょう。

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

    printf("you entered in reverse order:\n");

    while(argc--)
    {
        printf("%s\n",argv[argc]);
    }

return 0;
}

入力したすべてを逆の順序で引数として出力するだけですが、何かもっと便利な新しいプログラムを作成する必要があります。

コンパイルして(こんにちは)、次のような引数を指定して端末から実行します

./hello am i here

次に、2つの文字列が互いに逆であるかどうかを確認しようとするように変更してください

if(argc!=3)/*3 because even the executables name string is on argc*/
{
    printf("unexpected number of arguments\n");
    return -1;
}

次に、argv [2]がargv [1]の逆であるかどうかを確認し、結果を出力します

./hello asdf fdsa

出力する必要があります

they are exact reverses of each other

最良の例は、ファイルコピープログラムを試してみることです。cpのようなものです。

cp file1 file2

cpは最初の引数(argv [1]ではなくargv [0])であり、ほとんどの場合、参照などが必要な場合を除き、最初の引数は無視する必要があります。

cpプログラムを作成した場合、メインの引数を本当に理解しました...

9
Siamore

シアモア、私はプログラムをコンパイルするためにコマンドラインを使用しているすべての人を見続けています。 code :: blocks、私のlinuxボックスのgnu gccコンパイラーを介して、ideからx11端末を使用します。コマンドラインからプログラムをコンパイルしたことはありません。したがって、Siamore、プログラム名をcpにしたい場合は、argv [0] = "cp"を初期化します。 Cpは文字列リテラルです。そして、stdoutに行くものはすべてコマンドラインに行きますか?あなたが私に理解したシアモアの例を示しました!入力した文字列は数単語の長さでしたが、それでも引数は1つだけでした。二重引用符で囲まれていたためです。 arg [0]、prog名は、実際には文字列リテラルは改行文字ですか??だからif(argc!= 3)印刷エラーを使用する理由を理解しています。 prog name = argv [0]であり、その後にさらに2つの引数があり、エラーが発生したためです。それを使用する他の理由は何ですか?コマンドラインまたはターミナルからコンパイルする方法についての私の理解不足が、この分野での理解不足の理由だと本当に思います!!シアモア、あなたは私がclaのほうがずっと良いことを理解するのを助けてくれました!まだ完全には理解していませんが、私はこの概念を忘れていません。ターミナルからコンパイルして、あなたが書いたものを読み直す方法を学びます。きっと、私は完全に理解するでしょう!あなたからもう少し助けて笑

<>自分で書いたのではなく、自分の本から書いたコード。

#include <stdio.h>

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

    printf("The following arguments were passed to main(): ");
    for(i=1; i<argc; i++) printf("%s ", argv[i]);
    printf("\n");

    return 0;
} 

これは出力です:

anthony@anthony:~\Documents/C_Programming/CLA$ ./CLA hey man
The follow arguments were passed to main(): hey man
anthony@anthony:~\Documents/C_Programming/CLA$ ./CLA hi how are you doing?
The follow arguments were passed to main(): hi how are you doing?

したがって、argvは文字列リテラルのテーブルであり、argcはそれらの数です。現在、argv [0]はプログラムの名前です。したがって、。/ CLAと入力してプログラムを実行すると、。/ CLAはargv [0]になります。上記のプログラムは、無限の引数を取るようにコマンドラインを設定します。必要に応じて、3または4だけを取るように設定できます。 1つまたはあなたの例が示したように、Siamore ... if(argc!= 3)printf( "Some error goes here");シアモアに感謝します、あなたなしではできませんでした!ポストの残りの部分にも時間と労力を感謝します!

PS将来的にこのような問題が発生した場合は... IDE AKA Code :: Blocksを使用していたため、この問題は決してわかりませんでした。上記のプログラムを実行すると、プログラムのパス/ディレクトリが出力されます。例:〜/ Documents/C/CLA.cターミナルから実行し、コマンドラインを使用してコンパイルする必要があります。 gcc -o CLA main.cで、ファイルのディレクトリにいる必要があります。

8
anthony

Mainは他の関数とまったく同じで、argcとargvは他の関数引数と同じです。違いは、mainがCランタイムから呼び出され、引数をmainに渡すことですが、Cランタイムはcライブラリで定義されており、変更できませんしたがって、シェルまたはIDEを介してプログラムを実行する場合、メイン関数がパラメーターに応じてランタイムで異なる動作をすることができるように、メイン関数に引数を渡すメカニズムが必要です。パラメーターはargcで、引数の数と、値を文字列として保持するポインターの配列へのポインターであるargvを指定します。これにより、引数を制限することなく任意の数の引数を渡すことができます。

6
Yusuf Khan

@anthonyコードにわずかな変更を加えただけなので、引数の数値と値で適切にフォーマットされた出力を得ることができました。複数の引数がある場合、出力の読み取りが多少簡単になります。

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("The following arguments were passed to main():\n");
    printf("argnum \t value \n");
    for (int i = 0; i<argc; i++) printf("%d \t %s \n", i, argv[i]);
    printf("\n");

    return 0;
} 

出力は次のようになります。

The following arguments were passed to main():
0        D:\Projects\test\vcpp\bcppcomp1\Debug\bcppcomp.exe
1        -P
2        TestHostAttoshiba
3        _http._tcp
4        local
5        80
6        MyNewArgument
7        200.124.211.235
8        type=NewHost
9        test=yes
10       result=output
3
Nebojsa Tomcic