2012-04-08 7 views
1

C++の文字列に関する質問があります。以下のコードに従って、私はループがどこに止まるかを知りたいと思います。インデックス3またはインデックス4でヌルを取るか?ヌルバイトが検出されるまでforループをループスルーに設定します。

#include <cstdio> 

int main () { 

    char name [20] = "Foo"; 

    name [4] = '\0'; 

    for (int i = 0; name[i] != '\0'; i++) { 

     printf("This is the value of i so far in the loop : %d \n",i); 
    } 

    printf("This is the value of i : %d \n",i); 

return 0; 

} 

宿題で、彼らは私たちにこのような何かを与え、なぜ私はこれを求めています理由は、私は理解していないされています。インデックス4に '\ 0'を付ける理由はありますか?

+2

なぜあなたはそれを実行して見ませんか? – nakiya

+0

それはインデックス3で止まります。 –

+1

私は宿題でなぜ彼らにこのようなものを与えたのか分かりません。インデックス4に '\ 0'を付ける理由はありますか? – Jack

答えて

2

"foo" が{ 'F'、 'O'、 'O'、 '\ 0'}実際には、インデックス0,1,2に適合します、3。 インデックス4〜19はデフォルトで初期化されています(したがって0になっています)。また、索引4は後で '\ 0'で割り当てられます。

最初の '\ 0'が一致するとループが終了し、値0,1,2が出力されます。 ループの外にi shold ... ahem ..定義されていない! (ループスコープ内で宣言されていますが)コンパイラがクリーンアップしなかった場合は、3を印刷する可能性が最も高いです。

C++のtypycalの例(ノートは#include<cstdio>です。 C教師。 私のおめでとう!

+1

"インデックス4〜19は初期化されていません"。同意しません。 C++ 2003、8.5。1/7は次のように述べています。「集計に含まれるメンバー数よりもリストに含まれるイニシャライザが少ない場合、明示的に初期化された 以外の各メンバーは、値で初期化されます。 –

+0

悪いC++教師についての卑劣なコメントの+1。明確にするために、このプログラムは 'std ::'の不足のためC++ 2003で定義されているように "不正な形式"になっています。 –

+0

@Rob:あなたはそうです:char :: char()は値を生成するために使用する必要がありますので、すべて0にする必要があります。残念なことに、私は多くのコンパイラがそれをしていないのを見たので、通常は依存しません。 –

-1

私はそれが3であるべきだと思う:

name[0]='F' name[1]='o' name[2]='o' name[3]='\0' name[4]='\0' 
+1

これを分かりやすくするために編集したいと思うかもしれません。 –

1

インデックス4に '\ 0'を付ける理由はありますか?

絶対にありません。

name[0] <-- 'F' First char of "Foo" 
name[1] <-- 'o' Second char of "Foo" 
name[2] <-- 'o' Third char of "Foo" 
name[3] <-- '\0' Fourth char of "Foo" 
name[4..19] <-- 0 Extra spaces in array get zero-filled 

ので、この行:

name [4] = '\0'; 

書き込みをゼロすでにあることが保証場所

は、この行:次のように

char name [20] = "Foo"; 

は配列を初期化しますゼロ

インデックス3にゼロがあります( "Foo"の最後の文字です)。すべての位置4-19にゼロがあります(イニシャライザは配列よりも小さいので)。そして、重複して、インデックス4に0が書き込まれています。