加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:55:14 所属栏目:百科 来源:网络整理
导读:我试图使用getchar()读取输入数字的所有数字并将它们存储在一个数组中.但每次我运行程序时,第二个数字都会出错. 这是我的代码: int ch = 0;int digits[0];int i = 0;while ((ch = getchar()) != 'n') { digits[i] = ch - '0'; i++;} 为了显示出错的地方,我
我试图使用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("%dn",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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读