对这个argv使用感到困惑

时间:2012-10-11 14:41:38

标签: c++ argv

int
main(int argc,char **argv){

for (argc--, argv++; argc > 0; argc -= argCount, argv += argCount) {
      argCount = 1;
      switch (argv[0][1]) {
      case 'q':
        testnum = atoi(argv[1]);
        argCount++;
        break;
      default:
        testnum = 1;
        break;
      }
    }
//...............

我的问题是argv [0] [1]的意思是什么,而for()中的条件让我感到困惑,我的意思是for (argc--, argv++; argc > 0; argc -= argCount, argv += argCount)

//谢谢大家.... ** argv [0] [1]应该是argv [0] [1],这就是我的错误而不是代码编写者。

3 个答案:

答案 0 :(得分:2)

该代码看起来不正确。 **argv[0][1]尝试取消引用char

argv[0][1]会有意义,并且意味着“取char中第一个char*的{​​{1}}。”恕我直言,代码试图检测argv命令行标志(并随后将-q设置为下一个参数的testnum版本,盲目地假设它存在),但它正在跳过检查int,并盲目地假设它在那里,并且没有其他参数会将-作为第二个字符。

此代码需要重构。这是一种方式:

q

答案 1 :(得分:1)

argv[0]表示在命令行上调用的程序名称。如果您输入./myprogram --help,则argv[0]将为“./myprogram”。

argv[0][1]将是该字符串的第二个字符,在上面的示例中为“/”。


让我们看看for (argc--, argv++; argc > 0; argc -= argCount, argv += argCount)

它通过执行argc--初始化循环,然后argv++argv现在指向第二个用户参数字符串)并且argc声明参数更少。

循环适用于所有参数argc>0,并且在每次迭代时,处理的参数argCount的数量取自所有参数argc的数量。这是有道理的。

switch (**argv[0][1])没有任何意义,argv[0][1]char,如前所述,不是指针,因此无法取消引用。

答案 2 :(得分:0)

这段代码看起来很疯狂。我想你打算做以下事情:

int main(int argc,char **argv){
 char** p = argv + 1;  // skipping program name

 while (*p != 0) {     // over all parameters
  testnum = 1;
  if (*p[1] == 'q') {  // skipping - of "-q", not a good idea
    p ++;
    if (*p != 0) {     // may be null, read testnum from parameter,
                       // ?? no check whether this is an integer at all
       testnum = atoi(*p);
    }
  }
}

(未经过测试,可能无法编译或工作)