1
#include <stdio.h>

int main(int argc, char* argv[]){
  printf("argc: %d\n",argc);
  for(int i=0;i<sizeof(argv);i++){
    printf("argv[%d] %s\n",i,argv[i]);
  }
  return(0);
}

GNU / linuxディストリビューションのgnomeターミナルで使用すると、正常にコンパイルされます

printTest one\ two three
argc: 3
argv[0] /data/local/tmp/printTest
argv[1] one two
argv[2] three
argv[3] (null)

私は意図的に空白をエスケープしたままにしましたが、argvは本当に奇妙な動作をしているようです。

この動作は正常ですか?そのヌルは何ですか?なぜargvは、より短い配列を提供するのではなく、nullポインタを作成するのですか?

4

4 に答える 4

8

sizeof(argv)は無意味です。これはポインターのサイズ (プラットフォームでは 4) であり、この場合、たまたま値の数よりも 1 大きいだけargvです。

argc代わりにここを使用してください。

于 2012-10-13T19:11:13.567 に答える
4

この動作は正常ですか?

そのとおり。これone\ twoを1つの引数にすることを指定します。

そのヌルは何ですか?なぜargvは、より短い配列を提供するのではなく、nullポインタを作成するのですか?

アレイの終わりを示し、標準で必要です。argcたとえば、次のように使用せずにすべての引数をループすることができます。

while (*++argv) {
    // do something
}

しかし、duskwuffが指摘したように、コードにも間違いがあります。

于 2012-10-13T19:16:16.557 に答える
2

使用しないでください。引数の数ではなくsizeof(argv)、システム上のポインタのサイズを取得するだけです。

また、これは仕様に従っていることに注意してください。エスケープされたスペースや引数の数に関係なく、argv[argc]atがあります。NULLNULLargv[argc]

5.1.2.2.1 / 2から:

argv[argc]はnullポインタでなければなりません。

于 2012-10-13T19:16:33.803 に答える
1

これは、典型的な C っぽいイディオムをサポートするためのものです。

for (char** arg = argv + 1; *arg; arg++)
{
    // process next arg

ご覧のとおりargv、文字列の 0 で終わる配列です。

入力の個別の引数への分割はシェルによって行われ、言語はそれを定義しません。

于 2012-10-13T19:16:57.283 に答える