2014-03-30 22 views
0

我輸入以下命令行:如何用空格和輸入作爲C中的一個參數進行計數?

./file -a 1 -b2 -a5 -b 55 -b4 

我得到的輸出是:

a: 1 
argv[1]: -a 
b: 2 
argv[2]: 1 
a: 5 
argv[3]: -b2 
b: 55 
argv[4]: -a5 
b: 4 
argv[5]: -b 
Counter: 5 

我希望得到的輸出應該是:

a: 1 
argv[1]: -a 1 
b: 2 
argv[2]: -b2 
a: 5 
argv[3]: -a5 
b: 55 
argv[4]: -b 55 
b: 4 
argv[5]: -b4 
Counter: 5 

參數用空格都目前計爲2個參數。我希望我的程序僅將它計爲1個參數(我希望它看到「-a 1」,而不是「-a」和「1」)。

這是源代碼,我用我得到的輸出:

#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <getopt.h> 

int main(int argc, char *argv[]) 
{ 
    int opt = 0; 
    int quantum1 = 0, quantum2 = 0; 
    int counter = 0; 

    while ((opt = getopt(argc, argv,"a:b:")) != -1) 
    { 
     switch (opt) 
     {       
      case 'a' : 
       quantum1 = atoi(optarg); 
       printf("a: %d\n", quantum1); 
       break; 

      case 'b' : 
       quantum2 = atoi(optarg); 
       printf("b: %d\n", quantum2); 
       break; 

      default: 
       printf("Error\n"); 
       return 1; 
       break; 
     } 
     counter++; 
     printf("argv[%d]: %s\n", counter, argv[counter]); 
    } 

    printf("Counter: %d\n", counter); 

    return 0; 
} 

注:引號建議的工作,但我不能使用引號或任何其他符號。

回答

2

使用

 
./file "-a 1" -b2 -a5 "-b 55" -b4 

使 「-a 1」 作爲第一個參數, 「-b 55」 作爲第四個參數。

如果現在允許使用引號,你可以使用逃脫Linux中的空間:

 
./file -a\ 1 -b2 -a5 -b\ 55 -b4 
+0

它的工作原理,但我不允許使用引號。 –

+0

我不允許使用反斜槓或任何其他符號。它必須是選項(-a)和輸入(1)。 –

+0

如果您不允許使用單引號,雙引號或轉義字符,我不認爲您可以讓程序將'-a 1'作爲單個參數。 –

2

的問題是不是在參數在分析的方式。問題是代碼顯示參數的方式。具體來說,當選項和參數之間存在空格時,optind將前進兩位。 optind是一個外部變量,getopt用於跟蹤argv數組中的下一個索引。

所以,如果你只是消除counter和下面顯示的行,你會發現你的代碼已經正常工作。

counter++; 
    printf("argv[%d]: %s\n", counter, argv[counter]); 

printf("Counter: %d\n", counter); 

如果你絕對必須有發現的參數個數的計數,然後簡單地更新counter在每個case語句,例如

 case 'a' : 
      counter++; 
      ... 

     case 'b' : 
      counter++; 
      ... 

然後在最後打印計數器。這是printf("argv[%d]: %s\n", counter, argv[counter]);線,讓你感到困惑。這條線沒有用處,應該刪除。


對於./test -a1 -b 2命令行,argv中的字符串會

argv[0]: "./test" 
argv[1]: "-a1" 
argv[2]: "-b" 
argv[3]: "2" 

當你調用getopt第一次,它會讀取argv[1]並承認-a作爲選項之一是你已經指定了,所以它將字符串分成兩部分,並返回'a',同時將optarg設置爲"1"

當您第二次撥打getopt時,它將顯示argv[2]並將識別-b選項。由於您已指定-b接受參數,但argv[2]不包含參數,因此getopt將採用argv[3]作爲參數。因此,在將optarg設置爲"2"的同時返回'b'

底線是getopt被設計爲忽略該選項與其參數之間的空白區域。它通過處理兩個argv字符串來實現,如果用戶在選項和參數之間放置空格。

+0

我明白了。計數器計數「-a 1」和「-a1」作爲1個參數,但argv [計數器]不顯示「-a 1」和「-a1」作爲一個參數。 –

+0

當我輸入cmd時:./test -a1 -b 2 計數器正確計算argc(有3個argc)。 當我嘗試顯示argv [counter-1](argv以0開頭)時,它不會顯示「-b 2」,而是顯示「-b」。 –

+0

@LordRixuel我已經更新了答案,以解釋getopt如何處理argv數組中的字符串。 – user3386109

相關問題