您需要多一點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"));
除非我讀這個錯誤,你可能要添加一個額外的')'或兩個每個那些'line.'。但是,這可以通過使用甚至是兩個
std::string
成員來完成線。 :) – summea 2012-02-25 06:21:21這是在這裏嚴重的評論:http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c – Timeout 2012-02-25 06:21:53