3

これについて質問され、基本的にargcを考え出しました...実際にはargcを持たずに

あなたの与えられた argv が、私が理解しているように、入力された各引数の関連する char 配列へのポインターの配列である場合、

argv のポインターの数を実際にカウントするにはどうすればよいですか?

4

5 に答える 5

8

C 標準では、次のように指定されています。

argv[argc] shall be a null pointer.

したがって、 をテストすることで、いつでも終了を検出できます0

于 2011-11-11T17:06:16.120 に答える
2

私はここで何人かの人々に同意しません。

argv 自体は null で終了します。たとえば、次のように入力すると

$./foobar hello strawberry

あなたは得るでしょう

argv = [%p]  [%p]  [%p]  [NULL]
        |     |     |    
        |     |      \_"strawberry\0"
        |     | 
        |      \_"hello\0"
        |    
         \_"./foobar\0"

つまり、この種のコードは機能します。

while (*argv) {
    printf("%s\n", *argv);
    argv++;
}

試してみてください!

于 2011-11-11T16:54:44.860 に答える
2

一般に、配列がまたはのような「停止」値で明確に終了しない限り、できませ0NULL。これが存在する理由argcです。ポインター自体には、それらに関連付けられている要素の長さ/カウント/数はありません

配列へのポインターを渡すときは、必然的に要素の数も渡すか、1 つ多すぎる要素を明示的に割り当てて、配列の最後に「null」要素を追加する必要があります。

于 2011-11-11T16:39:48.107 に答える
1

それはいけません。配列が終了した後はランダム性があり、ランダム性と実際のデータを正確に区別することはできません。

于 2011-11-11T16:40:19.167 に答える
0

argv が提供されている場合は常に存在する argc を使用する必要があります。argv の最後の char ポインターは argv[argc-1] にあります。

于 2011-11-11T16:45:29.803 に答える