私は Kernighan と Ritchie の C の本に従っていますが、文字列を扱うのに苦労しています。
次のコードでは、ユーザーから入力された文字列に、ヌル ( ) 文字getchar()
の前に追加のジャンク文字が含まれているように見えます。\0
コードは次のとおりです。
#include <stdio.h>
main() {
char s[200];
int c, i;
printf("Enter input string:\n");
for (i = 0; ( c = getchar()) != '\n'; i++) {
s[i] = c;
}
printf("Contents of input string:\n");
for (i = 0; s[i] != '\0'; i++) {
printf("%d: (%d) = ", i, s[i]);
putchar(s[i]);
printf("\n");
}
return 0;
}
文字配列の各要素を 1 つずつ示す出力を次に示します。これは次のことを意味します。
Array_element: (ascii_number) = ascii_character
0: (72) = H
1: (101) = e
2: (108) = l
3: (108) = l
4: (111) = o
5: (32) =
6: (87) = W
7: (111) = o
8: (114) = r
9: (108) = l
10: (100) = d
11: (33) = !
12: (-1) = ?
13: (127) =
要素12と13が見えますか?(要素 14 はおそらくヌル文字です\0
)。ウィスキー。タンゴ。フォックストロット。
そして、これが本当のキッカーです。文字配列を200 ではなく100 要素のみを持つように定義すると、出力は合理的になります。たとえば、単純に置き換えると
char s[200]
と
char s[100]
出力は次のようになります。
0: (72) = H
1: (101) = e
2: (108) = l
3: (108) = l
4: (111) = o
5: (32) =
6: (87) = W
7: (111) = o
8: (114) = r
9: (108) = l
10: (100) = d
11: (33) = !
12: (9) =
(改行文字がどこにあるのかまだわかりません。アスキー文字 #10 ではないですか?)
繰り返しますが、ウィスキー タンゴ フォックストロットです。
ここで何が起こっているのですか?
アップデート
したがって、以下の回答のように、文字配列のサイズを 100 要素または 200 要素に設定したときの出力の違いは、本当に偶然の一致です。初期化されていないメモリでガベージ/ノイズをいじっているだけです。
\0
答えが鋭く示すように、配列を明示的に終了する必要があります。