6

सहित स्ट्रिंग हैं I boost :: program_options का उपयोग करके एकाधिक कमांड लाइन तर्कों को पार्स करना चाहते हैं। हालांकि, कुछ तर्क डबल कोट्स में संलग्न तार हैं।boost :: program_options - एकाधिक कमांड लाइन तर्कों को पार्स करना जहां कुछ रिक्त स्थान और वर्ण

void processCommands(int argc, char *argv[]) { 
    std::vector<std::string> createOptions; 
    boost::program_options::options_description desc("Allowed options"); 
    desc.add_options() 
    ("create", boost::program_options::value<std::vector<std::string> >(&createOptions)->multitoken(), "create command") 
    ; 
    boost::program_options::variables_map vm; 
    boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), vm); 
    boost::program_options::notify(vm); 
    if(vm.count("create") >= 1) { 
     std::string val1 = createOptions[0]; 
     std::string val2 = createOptions[1]; 
     ... 
     // call some function passing val1, val2. 
    } 
} 

इस ठीक काम करता है जब मैं

cmdparsing.exe --create arg1 arg2 

करते लेकिन काम जब मैं खिड़कियों कमांड लाइन से

cmdparsing.exe --create "this is arg1" "this is arg2" 

ऐसा नहीं करता है - यह मैं क्या है। दूसरे विकल्प के लिए, इसे createOptions वेक्टर में ["this" "is" "arg1" "this" "is" "arg2"] में परिवर्तित कर दिया जाता है। इस प्रकार, val1"this" और val2 "is""this is arg1" और "this is arg2" के बजाय क्रमशः 0 मिलता है।

मैं यह काम करने के लिए boost :: program_option का उपयोग कैसे कर सकता हूं?

+0

यह लिनक्स पर काम करता है। –

+2

जांच करने वाली पहली बात यह है कि ओएस आपके कार्यक्रम में उन विकल्पों को कैसे प्रदान कर रहा है। यदि 'cmdparsing.exe --create यह arg1' और' cmdparsing.exe --create "यह arg1 है" 'परिणाम' argv' सरणी के लिए समान सामग्री में है, तो आपको अपने ओएस को आश्वस्त करने का कोई अन्य तरीका ढूंढना होगा कि उद्धरणों में हिस्सा एक साथ रखा जाना चाहिए। –

उत्तर

-1

मैं अपना खुद का कमांड लाइन पार्सर लिखूंगा जो argv के माध्यम से चला गया और मैन्युअल रूप से विकल्पों को पारदर्शी करता है। इस तरह से आप कर सकते हैं जो कुछ भी आप चाहते हैं, चाहे वह इस तरह में -- पर " या केवल बंटवारे पर बंटवारे जा,

cmdparsing.exe --create1 arg1 --create2 arg2

या

cmdparsing.exe --create \"First Arg\" \"Second Arg\"

इसे मैन्युअल रूप से करने से, आप की बचत होगी एक पुस्तकालय से लड़ने के बजाए जो आप वास्तव में खोज रहे हैं उसे सही ढंग से लगाएं और सही तरीके से लगाएं जो ऐसा नहीं करता है जो आप करना चाहते हैं।

(आप \ वरना जरूरत है यह टूट जाएगा क्योंकि आप पहले से ही देख रहे हैं।

2

मैं एक देशी विंडोज समारोह जो आदेश पंक्ति तर्क अलग ढंग से हैंडल का उपयोग कर इसे तय की। जानकारी के लिए CommandLineToArgvW देखें। यह करने के लिए पारित करने से पहले processCommands(), मैं अपने argv [] को संशोधित कर रहा हूँ और विधि ऊपर उल्लेख किया है का उपयोग कर argc आप अपनी टिप्पणी के लिए बार्ट वैन इन्जेन Schenau धन्यवाद

#ifdef _WIN32 
    argv = CommandLineToArgvW(GetCommandLineW(), &argc); 
    if (NULL == argv) 
    { 
     std::wcout << L"CommandLineToArgvw failed" << std::endl; 
     return -1; 
    } 
#endif 
0

आप positional options साथ इस लक्ष्य को हासिल करने के लिए सक्षम होना चाहिए:।।

positional_options_description pos_desc; 
pos_desc.add("create", 10); // Force a max of 10. 

फिर जब आप कमांड लाइन इस pos_desc जोड़ने पार्स:

using namespace boost::program_options; 
command_line_parser parser{argc, argv}; 
parser.options(desc).positional(pos_desc); 
store(parser.run(), vm); 
संबंधित मुद्दे