我需要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;
}
答案 0 :(得分:1)
来自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;
}
答案 1 :(得分:0)
成功时,该函数返回参数的项数 列表已成功填写。此计数可以匹配预期的数量 由于匹配失败,读数,项目或更少(甚至为零) 错误,或文件结尾的范围。
如果发生读取错误或达到文件结尾 阅读,设置正确的指标(feof或ferror)。而且,如果有的话 在成功读取任何数据之前发生,返回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");
}
以匹配您的约束。
另请注意,在将变量传递给&
时,需要为变量添加scanf()
前缀,因为函数需要一个指针来处理(需要传递变量地址)。
修改强>
请参阅有关Windows中EOF问题的this topic
答案 2 :(得分:0)
您可以像这样重写代码
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表示输入流的结束。
答案 3 :(得分:0)
以下可能是一种稍微强一些的方法:
#include <stdio.h>
#include <string.h>
int main(void) {
int sum=0;
int num;
char *p;
char buf[1000];
fgets(buf, 1000, stdin);
p = strtok(buf," ");
while(p!=NULL) {
if(sscanf(p, "%d", &num) == 1) sum+=num;
p = strtok(NULL, " ");
}
printf("the sum is %d\n", sum);
}
测试:
> testme
1 2 3 4 0
the sum is 10
> testme
1 2 3 4 ^D
the sum is 10
注意 - 您必须输入ctrl-D
两次才能在一行结束时获得所需的效果。
答案 4 :(得分:0)
通过阅读“K N King的现代方法C编程”,您可以清楚地了解您的疑问
本书对此主题进行了适当的澄清
答案 5 :(得分:0)
为scanf()
,0
或1
测试EOF
的结果。
测试扫描的值0.0
。
int main(void) {
float num;
float sum = 0;
int cnt;
while ((cnt = scanf("%f", &num)) == 1) {
if (num == 0.0) break;
sum += num;
}
// cnt should be EOF, 0 or 1
if (cnt == 0) {
printf("Input is not a number\n");
}
else {
printf("Sum %f\n", sum);
}
return 0;
}
虽然通常scanf()
返回值EOF,0,1,...“格式说明符数”,但很少出现值0。示例输入为“+”。