【问题标题】:confused about this argv use对这个 argv 使用感到困惑
【发布时间】:2012-10-11 22:55:55
【问题描述】:
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],那是我的错误,不是代码编写者。

【问题讨论】:

  • 看起来像是在滥用 'for' 关键字
  • 这种代码确实缺少一些 cmets。
  • switch 行无效,argc[0][1] 是一个字符,而不是一个指针,你不能取消它一次(更不用说两次)。 argCount 也没有定义。请贴出真实代码。
  • **argv[0][1] 没有意义。 argv[0][1] 已经产生了一个 char,你不能只是取消引用。此代码不应编译。我假设真正的代码只是argv[0][1],然后它只是测试当前参数字符串的第二个字符。
  • argCount 定义我忘了把它放在...对不起

标签: c++ argv


【解决方案1】:

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

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

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

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

    int testnum = 1;
    for (int argi = 1; argi < argc; ++argi) {
        if(argv[argi][0] == '-') {
            switch (argv[argi][1]) {
            case 'q':
                if(argi + 1 == argc || argv[argi + 1][0] == '-') {
                    /* Handle missing argument error. */
                    return 1;
                }
                testnum = atoi(argv[++argi]);
                break;
            default:
               /* Handle unrecognized flag error. */
               return 1;
            }
        }
        else
        {
            /* Handle non-flag parameter. */
        }

    /* Continue with program. */
    return 0;
}

【讨论】:

  • 看起来确实有人试图变得“聪明”。此外,当找到-q 时,代码不会跳过所有其他参数,它只是直接跳过那个参数之后的参数。 argCount 在循环体内被重置为 1
  • @Xeo:我同意clever,特别是quorum 或(Mike 版本中的-quorum)被处理为q(分别为-q) ) 困扰着我。至少应该检查q 之后是空字符(如果希望保留开关结构)。
  • @Matthieu:实际上,我这样做是为了以后可以通过在@987654344 周围放置一个循环来扩展它以处理多个标志(例如-qavv 将是-q -a -v -v 的替代品) @。或者,可以声明参数可以紧跟在字母之后,即-qfoo-q foo 做同样的事情。
  • @Xeo:不,我很确定他确实不是是指空白字符。 argv 中的所有参数都是以 null 结尾的字符串,拆分参数是 shell 的工作,而不是程序的工作。 foo -q bar bobargc 设置为 4 并将 argv 设置为 { "foo", "-q", "bar", "bob"}。如果你想要一个空间,你需要在 shell 中引用它,例如foo -q' bar' 给你int argc = 2; char* argv[] = {"foo", "-q bar"};
  • @Mike:是的,我有点误解了。当然应该是空字符。
【解决方案2】:

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

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


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

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

循环针对所有参数argc&gt;0,并且在每次迭代中,处理的参数argCount 的数量从所有参数argc 的数量中扣除。这是有道理的。

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

【讨论】:

    【解决方案3】:

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

    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);
        }
      }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2018-09-29
      • 2020-03-02
      • 1970-01-01
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多