簡體   English   中英

C ++中可變數量的命令行參數

[英]Variable number of command line arguments in C++

我有一個程序( myprogram ),該程序接受一個文件作為輸入,並創建另一個文件作為輸出。 語法為:

myprogram inputfile outputfile

看起來像這樣:

int main ( int argc, char *argv[] )
{
...  
if ( argc != 3 ) {
    cout<<"wrong number of arguments"<< endl; return 1;}
   }
myInputFile = argv[1];
myOutputFile = argv[2];
...
}

所以這里我有argv[1]作為輸入文件。我現在想在語法中添加一些選項。 因此,例如,我希望將myprogram -a inputfile outputfile作為選項。 選項的數量會有所不同。

這意味着文件名將取決於參數的數量。

在代碼中最聰明的方法是什么? 我可以看到一個人只會將最后兩個參數作為文件名,然后假定在那之前的參數是選項(所以類似myInputFile = argv[argc - 1] 。這感覺不太正確,因為我結束了有很多if ... then語句。

所以我的問題是:如何最好地處理可變數量的參數?

最常見的方法是編寫一種特殊的方法來處理命令行參數。 您給它argcargv ,它返回一組結構化的數據值。 例如

struct commands
{
    char* InputFile;
    char* OutputFile;
    bool WhateverAMeans;
};

這樣,您的主循環便具有所需清單,並且不需要大量的循環。

通常,您的方法將使用for循環遍歷參數以填充命令。

另外,也可以使用幫助程序類為您完成這項工作,盡管我不建議您使用很長時間沒有做過的事情。

如果您不介意,我建議您使用一個處理所有這些問題的庫。 嘗試使用Boost.Program Options 它看起來可能比您預期的要復雜,但功能足夠強大。 還有很多C庫,例如getopt,popt等

看一下boost :: program_options,這是非常有用且干凈的工具。 我還使用了Poco :: OptionSet,但對我來說不是那么干凈,就像升壓一樣。 Poco和boost都需要由您自己構建,但是如果您從未使用過它們-那是很好的開始機會,它們都很棒。

如果您不想使用庫,該怎么辦:

char* myInputFile = NULL ;
char* myOutputFile = NULL ;
bool  option_a = false ;
int   argi = 1 ;

while ( argi < argc )
{
   const char* args = argv[ argi++ ] ;

   switch ( *args )
   {
      case '-' : /* option/switch */
         if ( strcmp( args, "-a" ) == 0 )
            option_a = true ;
         else
         {
            std::cerr << "Unknow option " << args << "\n" ;
            exit( 1 ) ;
         }
         break ;

      default :
         if ( myInputFile == NULL )
            myInputFile = args ;
         else if ( myOutputFile == NULL )
            myOutputFile = args ;
         else
         {
            std::cerr << "Unexpected argument " << args << "\n" ;
            exit( 1 );
         }
         break ;
   }
}

最后,當您處理所有參數時,您可以進行一些最終檢查,例如,測試是否設置了輸入文件和輸出文件:

if ( myInputFile == NULL )
{
    std::cerr << "Input file missing!\n" ;
    exit( 1 ) ;
}
...

您還可以將所有參數放入一個結構中,而不用將它們分開:

struct options_t
{
    char* myInputFile ;
    char* myOutputFile ;
    bool  option_a ;

    options_t() : myInputFile(), myOutputFile(), option_a() {}
} ;

這樣,您可以將所有參數傳遞給函數,而不必一一列出。

只是一個想法...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM