scanf
以两种不同的方式返回信息:在变量i
中,以及作为其返回值。变量的内容i
是读取的数字scanf
,如果它能够返回一个数字。from 的返回值scanf
指示它是否能够读取数字。
您的测试i != EOF
基本上是一个类型错误:您将错误指示符值EOF
与旨在保存浮点数的变量进行比较。编译器不会抱怨,因为这是意外有效的 C 代码:EOF
被编码为整数值,并且该值被转换为浮点值以执行比较。事实上,您会注意到,如果您-1
在提示符处输入,循环将终止。-1
是EOF
常量的值(在大多数实现中)。
您应该存储 的返回值scanf
,并将其存储到单独的变量中。如果返回值为EOF
,则终止循环。如果返回值为 1,则您已成功读取一个浮点值。
如果返回值为 0,则用户键入了无法解析的内容。您需要适当地处理这种情况:如果您什么都不做,用户的输入不会被丢弃,您的程序将永远循环。两个有意义的选择是丢弃一个字符或整行(我会做后者)。
double i;
double array[42];
int x = 0;
int r = 0;
while (r != EOF) {
printf("type in a number: \n");
r = scanf("%f", &i);
if (r == 1) {
/* Read a number successfully */
array[x] = i;
x++;
} else if (r == 0) {
printf("Invalid number, try again.\n");
scanf("%*[^\n]"); /* Discard all characters until the next newline */
}
}
您还应该检查x
是否不会溢出数组的边界。我把这个作为练习。