2017-05-02 10 views
2

2文字列を出力しようとしています。これがそのコードの一部です。Cプログラミング:配列自身で2文字を出力する

char arraytwo[3]; 
// 2 characters 
for (i = 'a'; i <= 'z'; i++) 
{ 
    arraytwo[0] = i; 
    for (j = 'a'; j <= 'z'; j++) 
    { 
     arraytwo[1] = j; 
     printf("%s\n", arraytwo); 
    } 
} 

出力はこれです。何らかの理由で、各繰り返しの最後に "AZ"を追加し続けます。私は何が欠けていますか?

aaAZ 
abAZ 
acAZ 
adAZ 
aeAZ 
afAZ 
agAZ 
ahAZ 
aiAZ 
ajAZ 
akAZ 
+9

'arraytwo [2] = '\ 0'' – kaylum

+2

'%s'は2文字だけではなくヌルで終了する文字列を出力することを意味します –

+1

文字を(配列なしで)印刷するとどうなりますか? –

答えて

5

何が欠けているのは、それは定義により、ヌル終端である必要があり、文字列の定義です。

C11を引用し、章§7.1.1、(強調鉱山

文字列は最初のヌル文字 含めで終了した文字との連続配列です。 [...] arraytwoのためのあなたの場合は

  • それは自動ストレージだ、と明示的に初期化されていません。
  • 手動でヌル終了しませんでした。

だから、技術的には、arraytwoない文字列です。

%sフォーマット指定子への引数として、ヌルターミネータを検索すると範囲外アクセスが発生します。原因はundefined behaviorです。何l長修飾子が存在しない場合

また章§7.21.6.1

s

を引用すると、引数が文字型の配列の初期 要素へのポインタでなければなりません。 280)アレイの文字は、終端のヌル文字まで(ただしこれには含まれません) です。 [...]

ソリューション:

  • のどちらか、0char arraytwo[3] = {0};
  • のようなものを配列要素を初期化するか、手動でヌルarraytwo[2] = '\0';
のように、あなたの配列を終了

配列を使用する前に文字列

+1

正しい方向を指摘していただきありがとうございます。 'arraytwo [2] = '\ 0';' の文字列を終了し、文字を正しく出力するようになりました。 – zohan

+0

@zohanこれは良いことですが、私はちょうどもう一つの方法を追加しました。更新された答えを参照してください。 :) –

+0

@スラバおかげさま。 これらの章の出典は?私はそれを詳細に読む必要があります。 :) – zohan

2

長さ3の配列を作るのはいい方法ですが、すべて0に初期化していませんでした。だからあなたのスナップの始めに、配列にはランダムなゴミが含まれていて、配列の後にはランダムなものがいくつか来ます。

printf("%s")関数呼び出しへのポインタを渡すと、printfはポインティング値から始まり、ポインタが'\0'になるまでインクリメントします。

あなたの場合、これはすでに2つのランダムな文字の後に起こります。しかしそれはする必要はありません。そして、ベルリング文字(それは'\b'だと思います)があなたのprintf呼び出しのランダムな部分にもあると、あなたのコンピュータはビープ音を出すことさえあります。

+0

マイクありがとうございました。理解しています。 – zohan

関連する問題