使用C中的scanf在EOF退出while循环

我正在为我的入门C课程写一些非常小的课程。 其中一个要求我读取双倍值,每行一个数字,然后在EOF后打印出基本统计数据。 这是我的代码段,它给了我一些问题:

double sample[1000000]; int result; double number; int i = 0; int count = 0; double sum = 0; double harmosum = 0; result = scanf(" %lf \n", &number); double min = number; double max = number; while(result != EOF){ sample[i] = number; if(number  max){ max = number; } sum += number; if(number != 0){ harmosum += (1 / number); count++; } i++; result = scanf(" %lf \n", &number); } 

在此之后,我根据数字计算并打印一些统计数据。

我的问题是,我永远不会从扫描每一行的循环中解脱出来。 为什么是这样? 当我按下窗口上的EOF键(CTRL-Z?)时,控制台会说:

^ Z暂停

就是这样。 程序中没有其他任何东西运行。 我试过从文本文件中获取输入,但是也没有在那里检测到文件的结尾。 我应该如何解决这个循环? 注意我只能使用基本的scanf()函数没有变化。 谢谢!

以下代码简化了I / O问题。

" %lf "提供3个scanf()格式指令:1)空格2)双指定符,3)空格。

不需要第一个white-space指令,因为%lf允许可选的前导空格。 第二个空白空间指令会导致出现问题,因为它会消耗Enter键 ,等待其他输入。

 "%lf" supplies 1 scanf() format directives: double specifier 

这会消耗可选的前导空格,包括之前的任何\ n,然后扫描并希望解码双精度。 数字后面的\n输入键 )将保留在输入缓冲区中,用于下一个输入(下一个scanf())。


现在为什么你的控件Z失败了 。 您的控制台似乎正在使用^ Z并执行“暂停作业”。 我的控制台不是给程序提供^ Z,而是关闭stdin输入。 本质上是将一个EOF放入stdin。

所以你需要:
1)找到你的控制台关闭stdin的机制 – 其他人建议^ D.
2)使用替代方法退出循环。 我建议result != 1 ,当输入非数字输入时很容易发生。

 #include  int main(int argc, char *argv[]) { int result; double x = 0.0; do { // result = scanf(" %lf ", &x); /* Your original format */ result = scanf("%lf", &x); printf("%d %lf\n", result, x); fflush(stdout); // Your system may not need this flush } while (result != EOF); } 

好吧,伙计们,在放弃了项目的第一部分并调试其他部分之后,我已经确定我上面代码的唯一问题是我试图引用一个超出范围的数组的索引。 我还确定EOF键是ctrl-d,即使我已阅读并被我的教授告知它是Windows的ctrl-z。 无论如何,这应该是一个简单的解决方案。 非常感谢所有提供输入的人!