2012-02-25 51 views
0

我想使用空格作爲分隔符來解析字符串。我知道它可以使用來自字符串庫assignsubstringfind的3種方法完成。基本上我想將我的目標字符串從字符串的開始處分配給第一次出現的空白字符串。使用assign,substring和find方法解析空白字符串

這將是這樣的

while(!line.empty()) 
{ 

    line.assign(line.substr(0, line.find(" ") 
    line.erase(0, line.find(" "); 

} 

我的問題是,這會不會去了解解析字符串的好辦法?

+0

除非我讀這個錯誤,你可能要添加一個額外的')'或兩個每個那些'line.'。但是,這可以通過使用甚至是兩個std::string成員來完成線。 :) – summea 2012-02-25 06:21:21

+1

這是在這裏嚴重的評論:http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c – Timeout 2012-02-25 06:21:53

回答

2

您需要多一點line變量:因爲如果字符串包含非空格字符,您的代碼將不會終止。當然,這假定它首先編譯,因爲有許多括號和分號丟失(另外,你的問題與你的代碼不匹配:沒有函數substring;如果你想有效編程,你有要非常精確的關於的一切:電腦把你的說法寫得很直白)。你可能想把你的line切成小塊並放入某種容器中。

一旦在這些瑣碎的方面,你可能要考慮使用' '代替" ",因爲在這種情況下,編譯器和庫可以假設你想尋找一個字符,而不是字符序列。這可以更快一點。但是,這實際上不是空格而只是空間。空格還包括'\t'(製表符),'\r'(回車),'\n'(換行符),(垂直製表符),'\b'(退格)和'\f'(換頁)等多個特殊字符。說到速度,你可能不希望從字符串的開頭輸入erase()位,因爲這產生了O(n * n)算法,而這可以通過例如O(n)來完成。通過保持一個變量的位置。這也避免了兩次搜索的問題,這是不必要的昂貴。如果存在兩個相鄰的字符串,您還應該考慮行爲:應該在您的序列中產生一個空字符串,還是應該將它視爲有一個空格(在這種情況下,您可能也想使用first_not_of())。

其實,我只是重讀問題陳述:如果你只是想提取字符串到第一個空間,你不需要erase()empty(),或循環,如果你堅持要用assign()find()erase()

line.erase(line.find(" \t\r\n\v\b\f"));