2011-03-29 117 views
0

我有這樣的需求:我有一個像「-myArg:ArgVal」的字符串。解析C++中的C++字符串

std::string strArg = "-myArg:ArgVal"; 

現在,我要檢查在上面的字符串第一個字符總是「 - 」,如果第一個字符是「 - 」我應該刪除它,我應該存儲「myArg」和「ArgVal」在兩個不同的字符串對象。

我該如何有效地做到這一點?

+6

爲什麼你會爲這樣的事情擔心「效率」?你多久需要這樣做?它看起來像一個命令行參數,這往往意味着解析很少發生。 – unwind 2011-03-29 13:36:40

+0

@unwind:效率可以通過代碼行數或程序員分鐘數以及CPU時間來衡量。 – 2011-03-29 13:38:43

+0

在這種情況下更好地清晰。初始化代碼可能相當低效,因爲它只運行一次。只有對運行時間最長的東西進行優化,在你到達正確運行程序並通過所有測試的時刻,你甚至不用擔心。 – 2011-03-29 13:40:36

回答

3

試試這個

if (strArg[0] == '-') { 
    strVar1 = strArg.substr(1, strArg.find(':') - 1); 
    strVar2 = strArg.substr(strArg.find(':') + 1); 
} 

當然,我假設,如果字符串與'-'開始,然後會出現在它':'與之前和之後的字符。你應該檢查一下,因爲如果沒有它可能會導致錯誤

+4

添加一個空字符串檢查,strArg [0]不保證工作 – ognian 2011-03-29 13:39:31

1

看看std::string::substr()std::string::find()

1

最具擴展性和可靠性的方法是通過regular expressions。推薦的庫是Boost.Regex

+1

或在C++ 0x,'std :: tr1 :: regex'或'std :: regex' – Benoit 2011-03-29 13:41:02

+0

我喜歡正則表達式,但這是在這種情況下,OP需要什麼過度殺傷力。用手提鑽在牆上放一個相框。 – 2011-03-29 14:15:06

+0

@John你可以這麼說,你會說得對。我會選擇正則表達式,因爲當你需要修改這個解析器時,或者使它更加複雜時,你將擁有所有你需要的東西。 – ognian 2011-03-29 15:16:06

0

std :: string具有您需要的功能。您可以使用string::at檢查第一個字符,並使用string::substr創建子字符串。擦除單個字符的工作方式與此相同。

查看c++ reference瞭解更多信息。