2012-06-13 10 views
33

だから私はコマンドラインのパラメータは常にnullで終了するのだろうか?グーグルはこれがそうであることを示しているが、これが常に真実であることを保証できるか?char * argv [] main nullの引数は終了していますか?

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

    for(int cnt=1; cnt < argc; ++cnt) 
    { 
     p = argv[cnt]; 
     printf("%d = [%s]\n", cnt, p); 
    } 
    return 0; 
} 

$ MyProgram -arg1 -arg2 -arg3 
1 = -arg1 
2 = -arg2 
3 = -arg3 
+4

はい、これは該当します。 – kol

+2

分:NULLが終了していないとどうなりますか? –

+0

分を考える... char []とchar *は自動的にCスタイルの文字列を意味しません。 明らかに、コマンドライン文字列全体はNULLで終端されていますが、コマンドラインで渡された個々の文字列がNULLで終了するたびに変換する必要はありません。 argvがコマンドライン上の空白を取り除くだけで、Cスタイルの文字列ではなくヌル終了文字配列を持つのは簡単です。 – LeviX

答えて

56

はい。 argv配列内のポインタは、C文字列を指します。

C言語スタンダードでは、単に配列メンバに "文字列へのポインタを含める"と述べています(C99§5.1.2.2.1/ 2)。文字列は「最初のヌル文字で終端された文字の連続シーケンス」(C99§7.1.1/ 1)です。つまり、それらはヌルで終端されています。

また、argv[argc]の配列要素はヌルポインタであるため、配列自体も「ヌル終了」となります。

+0

argvがnullで終了する場合、argcの使用法について説明できますか?私たちは何も発見できません。 '\ 0'に達するまで配列をトラバースすることで引数の数を減らすことができます。 – Snehasish

+0

@Snehasishはい、 'argv'から' argc'を計算することができます。なぜ「メイン」に署名があるのか​​、私は確かに分かりません。私が存在する前からこの方法がありました。 –

+0

それでは、その歴史的な理由からです... – Snehasish

4

はい、引数がNULLで終了する文字列であることは常に真です。

関連する問題