什么是++ argv? &安培;令人困惑的编译错误

时间:2014-11-04 00:02:33

标签: c++ compiler-errors argv dereference atoi

此代码由我的c ++讲师提供的样本期中考试。我们在非常基础的层面上介绍了argc和argv,所以我理解这些表达式本身就是什么意思。但是,对于像dereference运算符和' ++'让我感到困惑的是,我用google搜索的内容还不够清楚,我可以将它应用到这个具体的例子中。此外,当我尝试编译时,它提供了这个错误:

In function 'int summer(int*, char**)':
Line 9: error: cannot convert 'char**' to 'const char*' for argument '1' to 'int atoi(const char*)'
compilation terminated due to -Wfatal-errors.

我们尚未正式报道指针,但我认为我对它们了解得很好。 char **意味着你要解除引用两次,所以指针char的值是指向其他东西的指针,所以第二个*表示我们想要它的值。它是不变的,因为我们依赖于命令行中的输入并且无法更改?我不明白这一点。

#include <iostream>

using namespace std; 

int summer(int *acc, char * ptr[])
{
  register int n;

  n = atoi(ptr);
  *acc = *acc + n;
}

main(int argc, char * argv [])
{
  int sum = 0;

  while (--argc)
    summer(&sum, *++argv);

  cout << "sum is " << sum << endl;
}

另一个问题:当将* ++ argv传递给summer()时,这是否意味着(argv [] + 1)的值?甚至会是什么?将值1添加到整个向量?我知道atoi(数组)意味着将字符串更改为数值,然后我们将其存储在寄存器int&#39; n&#39;中,然后将其添加到main中直接更改的总和。这就是我真正理解的代码中唯一的部分。对不起,如果我的问题/这篇文章有点乱。

总结我的问题:

  1. 编译错误消息是什么意思?
  2. ++ argv做什么?
  3. 谢谢。


    编辑:

    好的,我已经做了你们建议的改变(谢谢!!):

    #include <iostream>
    
    using namespace std; 
    
    int summer(int *acc, char * ptr)
    {
      register int n;
    
      n = atoi(ptr);
      *acc = *acc + n;
    
      return 0;
    }
    
    int main(int argc, char * argv[])
    {
      int sum = 0;
    
      while (--argc)
        summer(&sum, *++argv);
    
      cout << "sum is " << sum << endl;
    
      return 0;
    }
    

    我还添加了返回值,因为编译器由于函数类型没有返回值而给出了新的错误。在键盘上,它编译并打印&#34;总和为零,&#34;但是,它仍然无法在我正在使用的Dev C ++ 5.7.1上编译。它没有显示错误消息(我一直在阅读的是来自Codepad在线编译器),或者至少我无法找到打开它们的位置。它只是突出显示它似乎有问题的线,这仍然是atoi(ptr)的线。

4 个答案:

答案 0 :(得分:2)

*argv相当于argv[0],因此++argv;会使*argv等同于原来argv[1]。因此*++argv评估与argv[1](第一个命令行参数,在程序本身的名称之后)相同的事情,除了它增加argv,而argv[1]显然不

对于您的错误,您应该更改:

int summer(int *acc, char * ptr[])
{

为:

int summer(int *acc, char * ptr)
{

当您取消引用char ** argv的类型时,您会获得char *char *atoi()所期待的。

您的计划基本上与此相同:

#include <iostream>
#include <cstdlib>

using namespace std;

void summer(int * acc, char * ptr)
{
    *acc += atoi(ptr);
}

int main(int argc, char * argv [])
{
    int sum = 0;

    for ( int i = 1; i < argc; ++i ) {
        summer(&sum, argv[i]);
    }

    cout << "sum is " << sum << endl;
}

除了您没有检查argc的麻烦值。

答案 1 :(得分:0)

++称为增量运算符。它通常会增加1。

argv衰减到指向程序参数容器的指针。

表达式++argv指向下一个参数(如果有)。

答案 2 :(得分:0)

增加指针意味着使其指向列表中的下一个项目。

argv的类型为char **don't be distracted by the square brackets),这意味着它指向char *,它位于相邻char *的列表中。 argc参数让我们知道在哪里可以找到所述列表的结尾。

因此,执行++argv意味着argv现在将指向列表中的下一个char *。将*应用于此(并将结果传递给函数)意味着我们将列表中下一个char *的值发送给该函数。

所有这一切的结果是每个参数调用一次函数,不包括第一个参数(因为我们在第一次解除引用之前++&#39; d。)

NB。这段代码实际上有一个bug;如果argc == 0它会进入la-la land。它应该在进入循环之前检查这种情况。

答案 3 :(得分:0)

  

它是否保持不变,因为我们依赖于命令行中的某些输入并且无法更改?

不,const char *位指的是atoi()接受的参数类型。它是指向常量char的指针。请注意,char *可以隐式转换为const char *,但不能相反。

所有这些意味着atoi()接受指向一个字符的指针,它承诺它不会修改指针的目标。

我的猜测是ptr参数应该是char * ptr而不是char * ptr[]。如果你改变它,代码应该编译。