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

时间:2013-06-20 17:35:45

标签: c while-loop scanf eof

我正在为我的入门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 < min){
        min = 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()函数没有变化。谢谢!

2 个答案:

答案 0 :(得分:1)

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

" %lf "提供3个scanf()格式指令:1)white-space 2)double specifier,3)white-space。

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

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

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


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

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

#include <stdio.h>
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);
}

答案 1 :(得分:1)

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