70

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

4

6 に答える 6

171

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

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

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

したがって、次のようにプログラムを実行したとします。

./program hello world

それで:

  • argc は 3 になります。
  • argv[0] は「./program」になります。
  • argv[1] は「こんにちは」になります。
  • argv[2] は「世界」になります。
于 2010-11-14T05:40:27.893 に答える
10

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

*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 つの文字列が互いに逆であるかどうかを確認するように変更してみてください。次に、エラーが出力される場合は、argc パラメータが正確に 3 であるかどうかを確認する必要があります。

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 ファイル1 ファイル2

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

cp プログラムを作成した場合は、主な引数を本当に理解しています...

于 2010-11-14T19:18:32.177 に答える
9

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

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

#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("エラーが発生しました"); ありがとう、シアモア、あなたなしではできなかったでしょう!投稿の残りの時間と労力にも感謝します!

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

于 2010-11-16T06:07:58.820 に答える
9

posix システムでコマンド ライン引数を解析するには、getopt()コマンド ライン引数を処理するライブラリ ルーチンのファミリを使用するのが標準です。

良いリファレンスはGNU getopt マニュアルです

于 2010-11-14T05:44:25.740 に答える
6

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

于 2010-11-14T11:01:42.420 に答える
3

@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
于 2016-12-08T13:31:03.933 に答える