在null字符之前的这些附加字符是什么?

EMi*_*ler 3 c ascii getchar

我正在关注Kernighan和Ritchie的C书,但是我在使用弦乐时遇到了一些困难.

在下面的代码中,似乎我的字符串,虽然从用户输入通过getchar()包含额外的,我会说是垃圾字符,在null(\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;
}
Run Code Online (Sandbox Code Playgroud)

这是输出逐个显示字符数组的每个元素.它意味着以下内容:

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) = 
Run Code Online (Sandbox Code Playgroud)

你看元素12和13?(元素14可能是空字符\0).威士忌酒.探戈.狐步舞.

这里是真正的踢球者,如果我将字符数组定义为只有100个元素而不是200个,那么输出是合理的.例如,如果我只是替换

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) = 
Run Code Online (Sandbox Code Playgroud)

(我仍然不确定换行符在哪里.是不是ascii字符#10?)

再次,威士忌探戈狐步舞.

这里发生了什么?

更新

因此,根据下面的答案,当我将我的字符数组设置为100或200个元素时,输出之间的差异实际上是巧合 - 我只是在未初始化的内存中使用垃圾/噪音.

我需要明确地终止我的数组,\0正如答案敏锐地指出的那样.

pb2*_*b2q 7

在本练习中,如果您希望在输入后字符串中存在空字符,那么您需要自己添加它.

您正在观察奇数字符,因为C中的变量和数组未初始化:它们可以包含任何垃圾值,可能包括随机放置的空字符.

当您更改数组大小时,您可能会观察到不同的输出,但不要指望任何合理的,预期的或可重复的行为 - 它是未定义的 - 因为这些数组值可以是任何值.