我需要帮助短代码在C,我必须阅读浮动在输入行与空格分开,输入是以浮点数0或EOF结束。
如果我不知道有多少个数字或输入,或者它是如何工作的,如果我只读数字而不是字符,如何向EOF询问如何做到这一点?
谢谢你的回应。
单行输入示例:
12 11 10 45 50 12 EOF
12 10 11 45 0
int main(void)
{
float num;
float sum = 0;
do{
scanf("%f", num);
sum += num;
} while(EOF || num == 0);
return 0;
}发布于 2014-03-12 18:49:25
来自扫描参考
成功后,函数返回成功填充的参数列表中的项数。由于匹配失败、读取错误或文件结束的影响,此计数可以与预期的项目数匹配,或小于(甚至为零)。 如果读取错误发生或读取时到达文件末尾,则设置正确的指示符(feof或feof)。而且,如果在任何数据被成功读取之前发生任何一种情况,则返回EOF。 如果编码错误发生在解释宽字符时,函数将errno设置为EILSEQ。
因此,您可以将do-while循环重写为以下内容
int retval;
while((retval = scanf("%f", &num)) != EOF && retval > 0 && num != 0) {
sum += num;
}
if(retval == 0) {
printf("input read error.\n");
}来匹配你的约束。
还请注意,在将变量传递给&时,需要在变量中添加前缀,因为函数需要处理一个指针(您需要传递变量地址)。
编辑:
参见本题关于Windows中的EOF问题
发布于 2014-03-12 19:05:31
从scanf的手册-
scanf返回成功匹配和分配的项数,在早期匹配失败的情况下,这些项可以少于规定的数量,甚至为零。如果在第一次成功转换或匹配失败之前到达输入结束,则返回EOF值。
这意味着scanf只有在被调用时遇到EOF作为第一个输入时才会返回EOF,因为EOF之前必须有一个换行符'\n‘,否则它将不能工作(取决于操作系统)。您还必须说明scanf可能遇到的匹配失败。
#include <stdio.h>
int main(void) {
float num;
float sum = 0;
int val;
while((val = scanf("%f", &num)) != EOF && val == 1) {
sum += num;
}
if(val == 0) {
printf("matching failure. input is not a float.\n");
}
else {
printf("end of input.\n");
}
return 0;
}发布于 2014-03-12 19:04:39
您可以像这样重新编写代码
int main(void)
{
float num;
float sum = 0;
do
{
scanf("%f", &num);
sum += num;
} while((!feof(stdin)) && (num != 0));
printf("%f", sum);
return 0;
}这里feof表示输入流的结束。
https://stackoverflow.com/questions/22361004
复制相似问题