使用一个EOF退出带有一行数字的scanf循环

时间:2014-03-10 15:55:29

标签: c scanf eof

我对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

4 个答案:

答案 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上。