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

C – getchar()没有正确读取输入的第二个字符,第1张

概述我试图使用getchar()读取输入数字的所有数字并将它们存储在一个数组中.但每次我运行程序时,第二个数字都会出错. 这是我的代码: int ch = 0;int digits[0];int i = 0;while ((ch = getchar()) != '\n') { digits[i] = ch - '0'; i++;} 为了显示出错的地方,我插入了两个printf @H_419_0@ @H_419_0@ 我试图使用getchar()读取输入数字的所有数字并将它们存储在一个数组中.但每次我运行程序时,第二个数字都会出错.

这是我的代码:

int ch = 0;int digits[0];int i = 0;while ((ch = getchar()) != '\n') {    digits[i] = ch - '0';    i++;}

为了显示出错的地方,我插入了两个printf:

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

例如,当我输入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

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

解决方法

every time I run the program something goes wrong with the second digit.

这是因为您已将数组数字声明为零大小数组,并且编译器不会为您的数组分配任何内存.因此,写入数组中的任何位置实际上将写入为其他目的分配的内存位置(如为其他变量分配),并且它将具有未定义的行为.

因此,您得到的结果是由于未完成的行为而在您的情况下,使用带数字的索引写入任何位置实际上是写入分配给程序中其他变量的内存,并且您通过数字[1]获得的内存位置发生在程序中分配给char类型的变量ch的内存位置.因此,写入内存位置数字[1]将修改您的ch变量.因为,它是未定义的行为,您可能会得到程序的分段错误.

要解决您的问题,请声明数组数字足够大.

#define SIZE_DIGITS  /* SufficIEnt Size required by your application */int digit[SIZE_DIGITS];

但是,在标准C和C中,不允许使用零大小的数组,如果您使用的是GCC,请使用-pedantic选项进行编译.它会发出警告,说:

zero.c:3:6: warning: ISO C forbIDs zero-size array 'a' [-pedantic]

在C的情况下,它给出类似的警告.

此外,零大小的数组作为结构的最后一个元素非常有用,它实际上是一个可变长度对象的头.它们在GNU C中是允许的.具有零大小数组作为最后元素的结构称为可变长度结构.你可以阅读更多关于它here.

@H_419_0@ 总结

以上是内存溢出为你收集整理的C – getchar()没有正确读取输入的第二个字符全部内容,希望文章能够帮你解决C – getchar()没有正确读取输入的第二个字符所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1223863.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存