scanf
两种不同的方式返回信息:在变量i
,并作为其返回值。变量i
的内容是scanf
读取的数字,如果它能够返回一个数字。来自scanf
的返回值指示是否能够读取数字。
您的测试i != EOF
基本上是一个类型错误:您将错误指示器值EOF
与设计用于保存浮点数的变量进行比较。编译器不会抱怨,因为这是意外的有效C代码:EOF
被编码为整数值,并且该值被转换为浮点值以执行比较。事实上,您会注意到,如果在提示时输入-1
,循环将终止。 -1
是常量(大多数实现)的值。
您应该存储返回值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
是否不溢出数组的边界。我将此作为练习。
好的,所以我意识到在终端输入-1会做我想做的事情,但我想通过输入不是数字的东西来实现。我怎样才能做到这一点? – JLA 2013-03-23 20:00:06
比你应该读入一个字符数组(字符串)的输入并解析结果。如果它的一个数字继续,如果它没有测试终止文本 – giorashc 2013-03-23 20:01:53
按'ctrl + D'?顺便说一句,你必须检查'scanf'的返回值!并阅读'man scanf'。 – 2013-03-23 20:03:15