0

我正在为我的 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);  
}

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

我的问题是,我永远不会离开扫描每一行的循环。为什么是这样?当我在 Windows 上按下 EOF 键(CTRL-Z?)时,控制台会说:

^Z 暂停

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

4

2 回答 2

1

下面的代码是对您的 I/O 问题的简化。

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

不需要第一个空白指令,因为它%lf允许可选的前导空白。第二个空白指令会导致问题,因为它使用Enter 键,等待额外的输入。

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

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


现在至于为什么你的控制 Z 失败了。看来您的控制台正在使用 ^Z 并执行“暂停作业”。我的控制台没有将 ^Z 提供给程序,而是关闭了标准输入。本质上,将 EOF 放在标准输入中。

所以你需要:
1) 找到你的控制台关闭标准输入的机制——其他人建议 ^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);
}
于 2013-06-21T01:53:44.797 回答
1

好的,伙计们,在放弃项目的第一部分并调试其他部分之后,我确定上面代码的唯一问题是我试图引用超出范围的数组索引。我还确定 EOF 键是 ctrl-d,尽管我的教授已经阅读并告诉我它是用于 windows 的 ctrl-z。无论如何,这应该很容易解决。非常感谢所有提供意见的人!

于 2013-06-21T02:06:00.890 回答