【问题标题】:How can i read a line of numbers from stdin & compute their average?我如何从标准输入读取一行数字并计算它们的平均值?
【发布时间】:2013-01-20 11:51:00
【问题描述】:

我如何计算和提取标准输入中的元素数量?

例如,len() 在 Python 中很容易使用,但在 C 中不可用?

当用户输入时,我正在尝试计算平均值,例如: 1 3 5 7 8 10 11 -1

我尝试了以下方法:

while (user_input != -1)
{
    total   += user_input;
    scanf ("%d", &user_input);

    //cannot work               
    average = total /  ...
}       
printf("Average = %f\n", average);  

【问题讨论】:

  • 你应该输入一个原始行并解析它。
  • 这个问题没有意义..
  • 如果你想计算你在 while 循环中的次数。手动完成。 (就像你对总数所做的那样,只需添加 1 而不是 user_input)。
  • 您如何比较 C's scanf()Python's len() 之类的内容?我猜这里有一些 oompa loompas 在工作……

标签: c


【解决方案1】:

你必须维护一个计数器来做你想做的事情。它只是int counter = 0; 并在循环中:counter++

int counter = 0;
while (user_input != -1)
{
    total   += user_input;
    counter ++;
    scanf ("%d", &user_input);
}       
average = total / counter;
printf("Average = %f\n", average);  

显然,您必须检查 scanf() 是否返回至少 1 个

--- 编辑 --- 以下程序(对应于前一个程序)是有效的并按要求工作。不了解scanf() 工作原理的人应该远离该死的:

#include <stdio.h>

int main(int argc, char *argv[])
{
   int total = 0;
   float average = 0.0f;
   int userinput = 0;
   int counter = -1;
   while(userinput != -1){
      counter ++;
      if(scanf("%d",&userinput) == 1 && userinput != -1){
         total += userinput;
      }
   }
   average = ((float)total/(float)counter);
   printf("Average = %f", average);
   return 0;
}

输入:10 20 30 40 50 60 -1 输出:Average = 35

【讨论】:

  • -1 :显然,在 OPs Q 编辑和来自 OP 的 cmets 之后,这个答案不再相关。简而言之,它回答了 OP 不要求的东西。此外,它对将来偶然发现此答案的任何人都没有用。请编辑它以回答 OP 的要求,我将删除反对票。
【解决方案2】:

从您修改后的问题和 cmets 看来,您真正想做的是从用户那里读取一行输入,然后从该输入行中提取数字。
答案是您不能使用scanf 来做到这一点,您需要使用fgetsstdin 读取行,然后您需要从该读取行中提取数字。这是一个,
Quick sample program

#include<stdio.h>
int main()
{
    char line[1024], *beg, *end;
    long readvalue;
    while (fgets(line, sizeof(line), stdin)) 
    {
        beg = line;
        for (beg = line; ; beg = end) 
        {
            readvalue = strtol(beg, &end, 10);
            if (beg == end)
                break;
                printf("[%d]",readvalue);
        }
    }
    return 0;
}

输入:

1 3 5 7 8 10 11 -1

输出:

[1][3][5][7][8][10][11][-1]

【讨论】:

  • 我会给这个-1,它怎么能算数。 scanf() 中的元素数量?它唯一的没有。元素成功返回 IIRC
  • @Aniket:你阅读答案了吗?对你来说重要的一课,阅读然后发表评论,而不是反过来。
  • @Aniket 不完全是。 “成功完成后,这些函数应返回成功匹配和分配的输入项的数量;如果早期匹配失败,此数字可以为零” - 来自文档 here
  • @Alok 保存:ty。我刚刚编辑了我的 qn。假设用户输入是:1 3 5 7 8 9 -1 在一行中,我怎么还能计算平均值?
  • @brainsfrying:用户是否一次输入 1 3 5 7 8 9 -1?还是用户每次迭代都输入一个数字?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
  • 2019-08-08
  • 2014-02-08
  • 1970-01-01
相关资源
最近更新 更多