2012-10-11 39 views
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 (argc--, argv++; argc > 0; argc -= argCount, argv += argCount)困惑这个argv的使用

//谢谢你们.... * * argv [0] [1]应该是argv [0] [1],那是我的错误,而不是代码编写者。

+3

看起来像“的”关键字 –

+0

滥用这就是那种代码确实缺乏一些意见。 – Seismoid

+4

'switch'行无效,'argc [0] [1]'是一个char,而不是一个指针,你不能一次删除它(更不用说两次了)。另外argCount没有定义。请发布真实的代码。 – Mat

回答

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

该代码看起来不正确。 **argv[0][1]试图取消引用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; 
} 
+1

Definitly看起来像有人试图成为“聪明”。此外,当找到一个'-q'时,代码不会跳过每一个其他参数,它只是直接跳过该参数。循环体内的'argCount'被重置为'1'。 – Xeo

+0

** argv [0] [1]应该是argv [0] [1]谢谢 –

+0

在重构代码中应该是'argv [++ argi]'。 – Xeo

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

(未测试,可能无法编译,也不工作)