2

以下のようなコードを読んでmcachefsいて、いくつかのコードを理解できませんでした:

printf("mcachefs " __MCACHEFS_VERSION__ " starting up...\n");

if (argc == 1 || argv[1][0] == '-')
{
    fprintf(stderr,
        "\tError : first argument shall be the the mcachefs_mountpoint !\n");
    exit(2);
}

2 つの質問があります: 1:の場合printf("mcachefs " __MCACHEFS_VERSION__ " starting up...\n")、正しい使用方法printfですか? そのような使い方は見たことがありません。

  1. とはどういう意味argv[1][0]ですか? argv[]コマンドラインからの引数を表すことは知っています。でも、一次元配列じゃないですか。
4

7 に答える 7

2

__MCACHEFS_VERSION__最初の質問については、文字列リテラルのマクロである可能性が非常に高いです。C では、間に何もない場合、文字列リテラルは連結されます。

2 番目の質問でargv[1][0]は、関数に渡される最初の引数の最初の文字を参照します (たとえば、コマンドを入力するmyprogram -lamyprogram、argv[0] からアクセスでき、 になり-laますargv[1])。argv[0]実行可能ファイルの名前なので、実行可能ファイルへの引数はインデックス 1 からとなります。

したがって、コードargc == 1は、引数が渡されなかったことを意味するかargv[1][0] == '-'、最初の引数がフラグのようなものであることを意味する かをチ​​ェックし、エラーを返します。ここでのロジックは次のとおりです。最初に引数の数をチェックし、引数の数が 1 でない場合 (論理演算子の短絡効果)、最初の引数をチェックします。

于 2012-08-01T11:11:40.480 に答える
2
  1. C コンパイラは、多数の文字列リテラルが隣り合っていることを確認すると、それらを 1 つの長い文字列に連結します。printf()そのため、マクロが文字列に展開される限り、の使用は問題__MCACHEFS_VERSION__ありません。その文字列にはパーセント文字が含まれていないほうがよいでしょう...次のように書きます

    printf("mcachefs %s starting up...\n", __MCACHEFS_VERSION__);

  2. 他の人が指摘しているようargv[1]に、文字列配列の2番目の文字列であり、文字argv列は文字配列であるためargv[1][0]、2番目の文字列の最初の文字です。

于 2012-08-01T11:13:54.340 に答える
1

argvは1次元配列です。その要素は文字ポインタです。したがって、argv[i]はメモリ内のcharへのポインタを提供します。argvの値は、プログラム名の最初の文字(ac nullで終了する「文字列」として)およびプログラムに渡される追加の引数を指します。

argv [0] -------> my_program
argv [1] -------> -some_arg

argv要素が指す文字を取得するには、間接参照演算子を使用できます。

* argv [1]

または、Cを使用すると、配列構文でポインターを逆参照することもできます
。argv [1] [0] / *argv[1]に格納されているポインターを逆参照します*/

文字ポインタがargv配列の外部で使用されている場合は、より明確になる可能性があります。

char *arg1 = argv[1]

printf("first char of the first arg is %c\n",*arg1);  /* dereference char pointer */
printf("another way to access first char of %c\n",arg1[0]); /* dereference char pointer */
于 2012-08-01T11:32:59.733 に答える
1

の 2 番目の文字列の最初の文字を意味しますargv

于 2012-08-01T11:10:43.900 に答える
1

これにより、最初のパラメーターの最初の文字がダッシュであるかどうかが判断されます。

だから

command -firstparam

(argc == 1 || argv[1][0] == '-') は true と評価されます。

于 2012-08-01T11:10:54.603 に答える
1
  1. __MCACHEFS_VERSION__文字列リテラルのマクロです"1.0"。複数の文字列リテラルが隣接して配置されている場合、それらは連結されます。この場合"Version:" __MCACHEFS_VERSION__ "..."は になります。"Version: 1.0..."

  2. argv[1][0]2 番目の要素の最初の要素を参照します。以下と同等です。

    const char* firstArg = argv[1];

    char firstCharOfFirstArg = firstArg[0];

于 2012-08-01T11:19:06.233 に答える
1

argv[1][0]2 番目の文字列の 1 番目の文字を参照します。

表現

if (argc == 1 || argv[1][0])

言語の短絡評価に依存して、配列の逆参照を安全に保護します。つまり、テストargc == 1が失敗した場合、後続の式argv[1][0]は評価されません。その場合、逆参照によってセグメンテーション違反が発生する可能性があります。

printf の式は、文字列リテラルの連結に対する C 言語のサポートに依存しています。マクロ__MCACHEFS_VERSION__は、どこかで文字列リテラルとして #define されます。例に示すように、文字列を新しい行に分割したり、マクロで使用したりできます。文字列リテラル連結のその他の例については、http: //en.wikipedia.org/wiki/C_syntax#String_literal_concatenationを参照してください。

于 2012-08-01T11:14:38.857 に答える