C - getchar()没有正确读取输入的第二个字符

yix*_*oyx 3 c getchar

我试图用来getchar()读取输入数字的所有数字并将它们存储在一个数组中.但每次我运行程序时,第二个数字都会出错.

这是我的代码:

int ch = 0;
int digits[0];
int i = 0;

while ((ch = getchar()) != '\n') {
    digits[i] = ch - '0';
    i++;
}
Run Code Online (Sandbox Code Playgroud)

为了表明会出现什么问题,我插入了两个printf:

while ((ch = getchar()) != '\n') {
    printf("%d ", ch);
    digits[i] = ch - '0';
    printf("%d\n", ch);
    i++;
}
Run Code Online (Sandbox Code Playgroud)

例如,当我输入时1100,我得到:

49 49

49 1

48 48

48 48

当我在一个单独的循环中打印数组时,输出是:

1 10 0 0

当我输入时66666,我得到:

54 54

54 6

54 54

54 54

54 5

阵列是:

6 10 6 6 6
Run Code Online (Sandbox Code Playgroud)

我已经尝试了一堆不同长度的其他数字,每次第二个数字发生同样奇怪的事情,只有第二个数字.有谁知道为什么?非常感谢!

Joh*_*all 10

int digits[0];
Run Code Online (Sandbox Code Playgroud)

你有一个数字保持零位数.

int digits[32];     /* or some reasonable size, check for overflow... */
Run Code Online (Sandbox Code Playgroud)


Her*_*pes 6

正如已经指出过两次,你的数组的大小为零,因此不能容纳你试图在那里推的所有数字.

因此,当写入数组中的任何位置时,实际上是在写入用于其他内容的内存,ch例如hold.显然,这只是恰巧,你的程序预计地方(不存在的)digits[1]是,ch被存储.因此你覆盖chch - '0'.

然后,当离开范围时ch,程序可以自由地在那里写其他东西.(因为显然不再需要记忆了.)显然它决定写一些有价值的东西10.这导致了"奇怪"的输出.

请注意,在数组范围之外进行写入和读取是未定义的行为,并且可能具有比此更差的副作用.尽量避免将来使用它.