0

该程序应该计算参数的数量,迭代参数列表,对于每个参数,将参数转换为整数并将其复制到数组,迭代数组的元素,将每个元素的值添加到变量(这计算元素的总和),并打印总和。参数不会超过 15 个。到目前为止,我有:

int sumofA (int sizeofA, int x, int y){  
  int i = sizeofA;  
   if (i <= 15){  
      int z = x + y;  
      return z;  
   }  
}  

int main (int argc, char*argv[]){    
   int sizeofA = argc - 1;  
   int i = 1;  
   while (i <= sizeofA){  
      int x = GetInt (argc, argv, i);  
      i = i + 1;  
      int y = GetInt (argc, argv, i);     
      printf ("%d\n", sumofA (sizeofA, x, y));
   }  
   return 0;  
}  

好的,现在(当给定三个参数而不是 ./a 时)它打印第一个参数和第二个参数的总和......然后是第二个和第三个......然后是第三个参数的值。为什么?

这是 GetInt 的代码(我必须使用它):

int GetInt (int argc, char * argv[], int i) {  
   if (i < 0 || i >= argc) return 0;  
   return atoi(argv[i]);  
}  

我是否需要通过并将每个参数分配给一个整数(例如int z = GetInt (argc, argv, i + 2))?

4

5 回答 5

5

这里有几个问题:

  • i 未在 sumofA 中定义,因此与之比较会产生未定义的行为。
  • 如果 i >= 15,则不清楚 sumofA 将返回什么。
  • 你在循环内返回;这肯定不是你想要的。
  • 您的代码实际上并未在数组 A 中存储任何内容。

请在所有警告标志上编译您的代码(gcc:-Wall -Werror -pedantic),并确保在您的代码编译时没有警告。

请注意,不需要变量大小:使用while (i < argc)

编辑:现在您添加了GetInt的代码,替换

GetInt (argc, argv, i);

atoi(argv[i]);

GetInt没有用,因此您可以完全删除它。

最后:在您的问题中,您提到将数字存储在数组中,然后对它们求和。你这样做,还是要这样做(由于某些任务?)因为没有必要:只需将所有调用的结果添加到atoi。那么数组A是多余的。

编辑 2:我看到您在某些地方修复了代码。您的代码当前(23:31 CEST)将第一个参数分别添加到每个参数并打印它们。你还没到那一步。祝你好运!

于 2009-03-30T21:03:17.083 回答
2

你的问题在这里:

 int x = GetInt (argc, argv, 1);
 int y = GetInt (argc, argv, i);

当您第一次通过循环时,i 是什么,它会打印出什么?第二次通过循环呢?

于 2009-03-30T20:59:52.597 回答
2

对于初学者,您在循环的第一次迭代后返回 0。

于 2009-03-30T21:00:18.790 回答
1

由于您需要格式化帮助...

=首先,C 有更多的赋值运算符,而不仅仅是x = x + 1. 大多数语言(包括 C 语言)都提供了一个+=运算符,如下所示:x += 1. 这与 做同样的事情x = x + 1,而且更好。语法糖,但糖很好吃。

当我们谈到它时,C 和许多其他语言为+= 1- ++C++ 得名的运算符提供了一种特殊情况。所以真的,x = x + 1可以重写为x++具有完全相同的效果x++但是请注意,和之间存在主要区别++x,但目前这并不重要。现在,使用您想要的任何一个,并确保将其单独放在自己的行上,直到您了解 和 之间的x++区别++x

如果你发现你有一个你正在使用一次的变量,不要使用它。而不是这个:

int sizeofA = argc - 1;
...
while (i <= sizeofA){
  ...
  printf ("%d\n", sumofA (sizeofA, x, y));
}

试试这个:

...
while (i <= argc - 1){
  ...
  printf ("%d\n", sumofA (argc - 1, x, y));
}

或者(可能更好):

...
while (i < argc){
  ...
  printf ("%d\n", sumofA (argc - 1, x, y));
}

第三,你不应该盲目地将你的整个参数列表传递给它,只传递你当前想要转换的参数,但这是另一个问题,我想你不能改变GetInt(). 这似乎是另一天的战斗。

(第四,为什么这是一个社区 Wiki 问题?)

第五,我认为你的逻辑是错误的——如果你从 1 开始,我认为你不想在列表结束之前停止 1。但这是一个简单的错误,您可以稍后在您确定这实际上是错误时修复它。

最后,我建议您定义一个变量 , int answer,而不是printf()ing列表中的所有元素,只需遍历列表,将每个元素的数值添加到answer, 然后最后,打印输出answer。但也许我错过了任务的重点。或者,每次您遍历循环时,打印出answer,这样您就可以看到值每次都正确增长。我认为这更接近你在作业中真正想要做的,但我不能花时间检查,因为我有课要上。

于 2009-03-30T22:59:49.080 回答
0

第一次通过你的循环 x 和 y 都被赋予相同的值(因为 i=1),它们的总和被打印出来,然后函数返回结束你的程序。因此,您将获得第一个增值。

于 2009-03-30T21:05:00.493 回答