4
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],那是我的错误而不是代码编写者。

4

3 回答 3

2

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

argv[0][1]是有道理的,意思是“把第char一个char*中的第二个放进去argv。” 恕我直言,代码正在尝试检测-q命令行标志(并随后设置testnumint下一个参数的版本,盲目地假设它存在),但它正在跳过检查-,并盲目地假设它在那里,并且没有其他参数会曾经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;
}
于 2012-10-11T14:48:00.823 回答
1

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

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


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

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

该循环适用于所有 arguments argc>0,并且在每次迭代中,处理过的 argumentsargCount的数量都会从所有 arguments 的数量中扣除argc。这就说得通了。

然而switch (**argv[0][1])没有任何意义,argv[0][1]是 a char,如前所述,不是指针,所以它不能被取消引用。

于 2012-10-11T14:50:39.513 回答
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);
    }
  }
}

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

于 2012-10-11T14:55:54.190 回答