2017-12-02 171 views
0

我的問題是基於前一個問題的詢問çoptget有多個值是如何工作的:C getopt multiple value比方追查

就我而言,我只有一個參數-i,這是可選的。用戶必須使用此語法:

/a.out -i file1 -i file2 -i file3 

如果用戶不提供-i標誌,程序運行正常。用戶可以提供無限數量的文件作爲可選參數,例如,

/a.out -i file1 -i file2 -i file3 -i file4 -i file5 ... 

我這個getopt()開始while語句在main()

char *input; // ?? Now syntactically correct, but uninitialized? 

while ((opt = getopt(argc, argv, "i:"))!= -1){ 
    case 'i': 
     if (optarg == NULL){ 
      input = NULL; 
      } 
     else{ 
      strcpy(input, optarg); 
      break; 
    ... 
} 

然後我會通過這些可選參數的函數:

function1(char *required_arg, ...) 

在上述的情況下,將是:

function1(required_arg, file1, file2, file3, file4, file5) 

目前,我將input定義爲「文件」。我的問題是,如何跟蹤任意數量的可選參數以便稍後傳入函數?上面的代碼是錯誤的,因爲我正在爲每個-i參數傳遞重新定義input

用什麼數據結構?

+0

你可以傳遞參數數組(您可以將它們存儲在一個陣列) – coderredoc

+0

@coderredoc我將如何計算的,通過'傳遞的參數長度i'?也就是說,在上面有5個文件 – ShanZhengYang

+0

如果我錯了,糾正我 - 你想從選項'-i file1 -i file2'中得到你得到的文件的名字,然後你想把它們傳遞給其他方法。現在你的問題是你如何將它們傳遞給其他方法? – coderredoc

回答

2

我所建議的解決方案是將文件名傳遞給數組。該解決方案假設最大文件數爲10,最大文件名長度爲30.但是在類似的說明中,我們可以提供允許任意數量文件動態分配的機會。

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

#define MAXLEN 30 
#define MAXFILECOUNT 10 
void print(int fileCount, char files[][MAXLEN+1]){ 
    for(int i = 0; i < fileCount; i++){ 
     printf("%s \n",files[i]); 
    } 
} 
int main(int argc, char **argv) 
{ 
    int opt; 
    char fileName[MAXFILECOUNT][MAXLEN+1]; 
    int count = 0; 

    while ((opt = getopt(argc, argv, "i:")) != -1) 
    { 
     switch (opt) 
     { 
     case 'i': 
      snprintf(fileName[count++],MAXLEN,"%s",optarg); 
      break; 
     } 
    } 
    print(count,fileName); 
    return 0; 
} 

調用的程序一樣

./a.out -i file1 -i file2 
+0

感謝您的幫助。以上對我來說很有意義。然而,我仍然不理解函數'function1()'是如何獲取數組中的文件名並使用它們的。如果函數調用是'function1(required_arg,file1,file2,file3)',那麼必須編寫'function1()',以便抓取這些文件名並對它們執行某些操作。我的問題有意義嗎? – ShanZhengYang

+1

@ShanZhengYang:你不能合理地編寫一個函數來獲取一個可變長度的參數列表,然後用一些在運行時變化的參數輕鬆地調用它。想想'printf()';你總是在編譯時修正在調用中傳遞的參數的數量,並且在運行時你不能改變這個數字。與'execl()'和'execlp()'類似;您不能在運行時更改變量列表中的參數數目(具體而言,您不能將其增大到無限大;有多種方法可以使用最大大小或更小)。 _ [... continue ...] _ –

+1

_ [... continuation ...] _如果您想在運行時使用無限個參數,則可以使用數組和長度(例如'qsort()')或數組和哨兵(例如,'execvp()' - 通常,對於字符串或任何其他指針數組的數組,哨兵是空指針)。這就是建議的內容。 –