C - 查找scanf问题的最大,最小和最大值

时间:2015-04-22 02:03:36

标签: c stdin scanf

我一直在努力找到解决一些问题的解决方案,无可否认的是,C编程课程的基本任务。最简单的我会在这里寻求帮助;我经历过的绝对时间是一个指标,我不明白某些概念。

这个任务让我读取浮点值直到EOF,用换行符分隔;我的程序是获取这些值并记录最大值和最小值,并计算平均值并以特定格式打印它们。

#include <stdio.h>
#include <math.h>
#include <ctype.h>

int main()
{
    float buffer[200];
    float least, greatest = 0, mean = 0;
    float total = 0, count = 0;
    int x=0, y = 0;
    while (buffer[x] != EOF)
      {
        y = scanf("%f\n", &buffer[x]);
        if (y == 1)     
        {
            if (isspace(buffer[x])==0)
            {
                if (x == 0) {least = buffer[x];}

                if(buffer[x]>greatest) {greatest = buffer[x];}

                if(buffer[x]<least) {least = buffer[x];}

                total += buffer[x];
                count++;
                x++;
            }
        }
      }
    mean = total/count;
    printf("%.2f ", least);
    printf("%.2f ", greatest);
    printf("%.2f\n", mean);

    return 0;
}

我的代码能够处理格式良好的输入,但有一个转折点:标记方案将测试我的程序对空行的反应,这些空白行将被忽略。我的代码只有在每个输入都遵循指定的%f \ n格式时才能正常工作,并且如果有空行则打印错误的输出(或者我可能完全错误,而且其他地方根本就有问题)。

我已经尝试了一些适用于其他任务的解决方案,例如字符串输入的分隔符。这是我能想到的最好的,它确实有效;再次,它只有在有空行时才会失败,而且当有空行时我不知道到底出了什么问题。

感谢您阅读这些文字墙!这是我的第一篇文章,我不确定我是否粗鲁,过于自私,或者没有提供有关我案件的足够信息。

float* buffer;
float least, greatest = 0, mean = 0;
float total = 0, count = 0;
int x=0, y = 0;
buffer = (float*)malloc(200 * sizeof(float));
y = scanf("%f\n", &buffer[x]);
if (y == 0)
{
    return 1;
}
while (buffer[x] != EOF)
  {
    y = scanf("%f\n", buffer[x]);
    if (y == 0)
    {
        x++;
        continue;
    }
    if (isspace(buffer[x])==0)
    {
        if (x == 0) {least = buffer[x];}

        if(buffer[x]>greatest) {greatest = buffer[x];}

        if(buffer[x]<least) {least = buffer[x];}

        total += buffer[x];
        count++;

    }

    x++;
  }
mean = total/count;
printf("%.2f ", least);
printf("%.2f ", greatest);
printf("%.2f\n", mean);

return 0;

这是我使用的一个替代版本的主体,可能更多误导使用内存分配到缓冲区。但是,这个版本的段错由于我只能假设我接收和存储输入的原因;问题依然存在。

1 个答案:

答案 0 :(得分:0)

您正在以一种难以处理输入文件中的变体的方式解决问题。虽然您可以通过查看scanf返回来限制此范围,但这不是一个完整的解决方案。而不是使用scanf读取离散浮点数,而是使用fgets读取整行。正如您所描述的输入文件,每行有一个浮点值(或者没有或垃圾)。这提供了使用strtof转换每一行的完美方案。检查strtof的返回,你要么在线上有浮动,要么你没有,让你轻松处理空白或垃圾线。

此外,要计算leastgreatestmean,没有理由在程序的持续时间内存储每个值。阅读每个value,将值添加到total,增加count,然后测试当前value是新的least还是greatest和继续。无需存储它。

以下是从stdin读取浮点数并将其处理为所需值的简短示例:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <errno.h>

#define MAXL 200

int main()
{
    float value = 0.0;
    float least = (float)(INT_MAX);
    float greatest = (float)(-INT_MAX - 1);
    float mean = 0.0;
    float total = 0.0;
    size_t count = 0;
    char buffer[MAXL] = {0};

    while (fgets ( buffer, MAXL - 1, stdin) != NULL)
    {
        char *ep = buffer;
        value = strtof (buffer, &ep);
        if (errno == 0 && (ep != buffer && value != 0.0))
        {
            least = value < least ? value : least;
            greatest = value > greatest ? value : greatest;
            total += value;
            count++;
        }
    }

    mean = total/count;

    printf("%.2f ", least);
    printf("%.2f ", greatest);
    printf("%.2f\n", mean);

    return 0;
}

<强>输入

$ cat dat/float.dat
100.3
dogfood

300.1
The quick brown fox jumped over the lazy dog.


12.0

400.4

<强>输出

$ ./bin/read_float_lines < dat/float.dat
12.00 400.40 203.20