2011-09-17 103 views
2

我知道這個話題已經被毆打致死,但我還是沒找到我所尋找的。 我需要在C++中解析命令行參數。正確的使用方法的getopt/long_getopt

我不能使用升壓和使用long_getopt

的問題是在鑄造,當時我只是打印參數,它按預期工作的循環,但分配給變量的值不以某種方式工作。

下面是完整的,可編譯程序。

#include <iostream> 
#include <getopt.h> 
using namespace std; 

int main(int argc, char *argv[]) 
{ 
    int c; 
    int iterations = 0; 
    float decay = 0.0f; 
    int option_index = 0; 
    static struct option long_options[] = 
    { 
     {"decay", required_argument, 0, 'd'}, 
     {"iteration_num", required_argument, 0, 'i'}, 
     {0, 0, 0, 0} 
    }; 

    while ((c = getopt_long (argc, argv, "d:i:", 
       long_options, &option_index) ) !=-1) 
    { 
     /* getopt_long stores the option index here. */ 

     switch (c) 
     { 
     case 'i': 
     //I think issue is here, but how do I typecast properly? 
     // especially when my other argument will be a float 
     iterations = static_cast<int>(*optarg);  
     cout<<endl<<"option -i value "<< optarg; 
     break; 

     case 'd': 
     decay = static_cast<float>(*optarg); 
     cout<<endl<<"option -d with value "<<optarg; 
     break; 

    } 
    }//end while 
    cout << endl<<"Value from variables, which is different/not-expected"; 
    cout << endl<< decay << endl << iterations << endl; 
return(0); 
} 

正如我在評論中提及了 - 認爲這個問題是在類型轉換,如何正確地做到這一點?如果有其他更好的方法,請讓我知道。

爲--- ./program-name -d 0.8 -i 100

謝謝您的幫助,您可以運行該程序。我是新來的Unix和C++,但很努力學習吧:)

+0

getopt和朋友(已經很多)已經過時,並已被替換爲argp_parse()。 –

回答

4

您是鑄造一個字符串(字符*)值到整數值,這是分析它非常不同。通過強制轉換,可以使用第一個字符的ASCII值作爲數字值,而通過解析字符串,可以嘗試將整個字符串解釋爲文本並將其轉換爲機器可讀的值格式。

您需要使用分析功能,如:

std::stringstream argument(optarg); 
argument >> iterations; 

boost::lexical_cast<int>(optarg); 

或(C式)

atoi(optarg) 
+1

+1,除了一個方面。這種轉換不會「重新解釋字節」;它只是將第一個「char」的值轉換爲等效的「int」。 (這是非常不同的,以例如'*(的reinterpret_cast (OPTARG))'。) –

+0

感謝您的提示,因此編輯。 – thiton

+0

@ thiton,謝謝你,我想你的第一個建議,但我得到的錯誤 - 從「字符」無效轉換到「的std :: _ Ios_Openmode」我包括必要的文件 - fstream的和iostream的 –

0

因爲OPTARG是char *。這是純文本。所以,如果你把你的程序.8作爲參數,那麼optarg是一個字符串「.8」,並將其轉換爲浮動不起作用。使用例如atoi和atof函數(在'stdlib.h'中聲明)將字符串解析爲int和float。在你的代碼中它會是:

iterations = atoi(optarg); 
decay = atof(optarg); 
+0

我來自C背景,所以不太瞭解C++,但不是C++中這種類型的拋棄?我的觀點不是「讓它工作」,而是優雅地完成它。感謝您的幫助 –