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

yixiaoyx

我试图用来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

每当第二个数字(只有第二个数字)发生相同的怪异现象时,我就尝试了一堆其他不同长度的数字。谁知道那是为什么?非常感谢!

阿比奥罗拉

每次我运行程序时,第二位数字都会出错。

这是因为您已将数组声明digitzero-size array,并且编译器没有为数组分配任何内存。因此,写入数组中的任何位置实际上都会写入为其他目的分配的内存位置(例如为其他变量分配的),并且还将具有undefined behavior

因此,您得到的结果是由于这种UNDEFINED BEHAVIOR情况,在您的情况下,使用索引with写入任何位置digit实际上是写入分配给程序中其他变量的内存,而您获得的内存位置digit[1]恰好是分配给变量的内存位置程序中ch的类型char因此,写入内存位置digit[1]将修改您的ch变量。既然是undefined behavior,您可能会Segmentation Fault为您的程序得到一个

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

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

但是,在Standard C和C ++中,这zero-size array是不允许的,如果使用的是GCC,请使用-pedanticoption对其进行编译它会给出警告,说:

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

对于C ++,它会给出类似的警告。

同样,零尺寸数组作为结构的最后一个元素(实际上是可变长度对象的标头)非常有用。GNU C中允许使用它们。zero-size array最后一个元素的结构称为variable-length structure您可以在此处了解更多信息

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C#。在第二个字符后用点分隔字符串

在C ++中使用sort排序从第二个字符到最后一个字符的字符串

C#正则表达式第二个字符到最后一个字符模式匹配

使用正则表达式从c源获取函数调用的第二个字符串参数

为什么将 C# 类解析为 JSON 会自动将属性的第二个字符小写?

c# - 通过冒号拆分文本框中的字符串并获取第一个字符串和第二个字符串

无法打开第二个文件C

在扫描 badchars 以避免缓冲区溢出攻击时,十六进制数字“C2”不断出现在 hexdump 中的每个第二个字符

按C中第二个字段对结构数组排序

Printf和Scanf在第二个字符串输入中无法正常工作

C#从txt文件中读取第二个单词

C - 使用 getchar() 仅读取一个字符

特定字符后的第二个值的 C# 排序字符串

卷曲直到输入被按下才处理第二个请求C ++

无法从第二个字符串调用数据

C:带有第二个fget的错误字符

C++:第二个子类无法从父类继承属性

iostream无法打印到第二个源类中的终端(C ++)

无法在循环中输入第一个字符串,它总是从Java中的第二个输入开始

C#检查第二个屏幕的方向

C#方法第二个参数可选

解锁第二个屏幕的目标c

Getchar在C中仅保存1个字符

如何比较一个字符串输入是否为第二个字符串输入的前缀?

打印输入行中第一个字符小于第二个字符的字符对

从文件读取后,第二个字符数组覆盖第一个字符数组

尝试用空格将C中的字符串拆分并使用第二个单词

C# - 将第二个 JSON 字符串添加到现有类

C ++通过引用第二个对象传递3D数组,无法操作