【问题标题】:How do I find the average of double numbers entered at the command line?如何找到在命令行输入的双数的平均值?
【发布时间】:2013-05-28 22:18:40
【问题描述】:

我必须找到用户在命令行输入的双精度数的平均值,所以我的程序应该可以处理任意数量的输入。我知道我必须找到所有数字的总和,然后除以输入的数量。

我在想,要找到输入的数量,我会使用 sscanf 在我的参数列表中读取“char *num”。因为 sscanf 返回读取的字符。然后我想用它来除以得到平均值。但是我的代码有问题。 :(

#include <stdio.h>

void average(int arg_list, char *num[])
{
   int x;
   double sum, average;

   x = sscanf(num, "%s\n", &x);

   for (int i = 0; i != '\0'; i++)
   {
      sum = sum + num[i];
   }

   average = sum/x;
   printf("%lf\n", average);;
}

int main(int argc, char *argv[])
{
   if (argc == 0)
   {
      perror("Error!\n");
   }

   average(argc, argv);
}

具体来说,当我尝试编译我的程序时,编译器会抱怨“sscanf”和总和。 :/

【问题讨论】:

  • 一个问题是sscanf 中的格式字符串使用%s 来扫描整数。你试过%d吗?
  • 哦!让我看看有没有帮助,谢谢! :)

标签: c average


【解决方案1】:

"%s" 读取一个字符串。你想从字符串中读取双精度,所以你应该使用"%lf"循环内:

double sum = 0; //you forgot to initialize
//start from i=1, not 0; the first argument is the program's name
for (int i = 1; i < arg_list; i++) {
    double x;
//from the i'th argument, read a double, into x :
    sscanf(num[i], "%lf", &x);
    sum += x;
}
average = sum/(arg_list-1);

您还应该修复您的支票:

if (argc <= 1) {
   perror("Error!\n");
}

【讨论】:

  • 哦!我明白了…… sum += x 是什么东西的简写吗?
  • sum += x sum = sum + x
  • 使用sscanf 比使用atoi 有什么好处吗?
  • sscanf 灵活、简单且熟悉。 atoi 是一个坏主意,因为如果不成功,它会有未定义的行为。 strtol 好多了,但对我来说使用起来有点尴尬。
  • 我不允许使用 atoi。 :( 哦!还有一个问题,我要做的是读取字符串以获得输入的总数。我可以在循环之外对整个字符串执行 sscanf 吗?
【解决方案2】:
#include <stdio.h>
#include <stdlib.h>

void average(int arg_list, char *num[])
{
   double sum = 0, average;//sum : 0 initialize
   int i;
   for (i = 1; i < arg_list; i++){
      sum = sum + atof(num[i]);
   }
   average = sum/(--i);
   printf("%lf\n", average);;
}

int main(int argc, char *argv[])
{
   if (argc < 2)//include program name argv[0], argc == 1 even when only ./a.out
   {
      perror("Error!\n");
      return -1;
   }

   average(argc, argv);

    return 0;
}

【讨论】:

  • atof 也是个坏主意。 sum/(--i) 是一种奇怪的说法 argc-1
  • atof 单独也不错。如果最坏,它会被删除。如果您考虑需要检查 value-if,则不会使用 argc-1
  • atof 有未定义行为的情况。我不明白你的其余评论。
  • @Elazar 如果您考虑数字的健康状况,您应该计算通过测试的数字。
  • 你没有在你的答案中这样做,你应该为错误的输入提出一个错误,而不是容忍它。这就是 OP 在main() 中所做的事情。如果使用atof,您将不会知道输入是否错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
相关资源
最近更新 更多