2012-10-11 42 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); 
    } 
    } 
} 

(未測試,可能無法編譯,也不工作)