我对EOF有一个小问题。我需要在一行中写入数字,并在它们之间留出空格并将它们加在一起。 Scanf必须以一个EOF(Ctrl + D)结束 我有这个小程序
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv){
double numbers=0, sum=0;
printf("Enter numbers: ");
while(scanf("%lf", &numbers) != EOF){
sum=sum+numbers;
}
printf("\n %.2lf", sum);
}
这个程序的问题是我需要按两次Ctrl + d直到它打印总和。
输入/输出示例:
输入数字:1 3 5 6&lt;'Ctrl + d'&gt;
15.00
答案 0 :(得分:1)
scanf
返回它指定的值的数量;所以,如果你想使用它,你想要
while (scanf("%lf", &numbers) == 1)
或者,您可以使用更多的C ++习语(假设您打算使用该语言和C标记问题):
while (std::cin >> numbers)
答案 1 :(得分:1)
EOF
必须以换行符开头,否则无效。但是它取决于操作系统。您无法识别在包含输入的行末尾输入的EOF。来自scanf
-
scanf返回成功匹配和分配的项目数 它可以少于提供的数量,或者甚至为零 早期匹配失败。如果输入结束,则返回值EOF 在第一次成功转换或匹配之前到达 失败发生。
因此,您应该检查scanf
的{{1}}的返回值,而不是1
。
EOF
答案 2 :(得分:0)
程序显示此行为是因为,当您提供输入时
4 4 4
scanf()不会开始读取输入。按[enter]时,scanf()开始读取输入。所以如果你把输入作为
4
4
4
然后结果将在第一个结束
否则你将需要2秒,因为第一个开始读取输入并且它不会被读作EOF因为它只是使scanf()开始读取输入。因此,scanf()会将另外一个读取为EOF。
答案 3 :(得分:0)
stdin EOF
标志在第二个ctrl+d
连续之前不会打开,第一个ctrl+d
将屏幕上的任何内容推送到stdin缓冲区,第二个{{} 1}}设置ctrl+d
标志。
在另一种情况下,当您输入一些数字并按EOF
时,屏幕上的数字将被推送到stdin输入缓冲区,而enter
之后不久也会设置ctrl+d
标志。
在您的系统上这是正常行为,EOF
仅发生在第二个EOF
上。