2010-02-16 80 views
12

可能重複的字符串由空格:
C++: How to split a string?
Splitting a string拆分在C++

什麼是去了解在C分割字符串以空格最好的辦法++?

我希望能夠根據選項卡,空間等分割它,當然忽略多個選項卡/空格/等。並且最終沒有這些事情的問題。最終,我將最終將其存儲在一個向量中,但是如果存在一些簡單的內置標準庫分割方式,我可以輕鬆地在數據類型之間進行轉換。

我是一個UNIX機器的g ++上使用Microsoft Visual C++

+2

請參閱:http://stackoverflow.com/questions/236129/c-how-to-split-a-string – kennytm 2010-02-16 18:07:19

+2

和http://stackoverflow.com/questions/909289/splitting-a-string – Potatoswatter 2010-02-16 18:11:43

+5

這個問題讓我意識到多少蟒蛇讓我的生活更輕鬆。 – dassouki 2010-02-16 18:15:41

回答

11

這可能是矯枉過正這個特定的問題,但考慮到Boost.Regex建設這個,。 (老實說,我可能只是寫一個腳本,迴應每一個關於SO的C++問題,用'使用Boost',然後在業力中出現,但它確實有幫助)。

+3

+1爲您的第二段。如果沒有增加的代表,不能離開你。 – 2010-02-16 18:16:49

+1

我意識到這是很久以前發佈的,但我有一個衝動評論。我知道不是每個人都像我一樣,但我喜歡重新創造輪子......有時候我會回答我提出的問題,並提出使用提升的建議,但是我想知道爲什麼或如何運作,以及如何自行實施。當然,如果您不得不快速發佈產品,由於功能增強提供已經過測試和可靠,它絕對是一個不錯的選擇。但是,如果您有時間學習如何實現這些功能的功能,它將爲您提供非常寶貴的技能。所以 - 不要創建該腳本;)除非緊急。 – 2014-11-03 21:14:15

+0

這就是爲什麼我從不投票使用提升的答案。 – 2018-01-22 20:48:22

15

這可能是值得商榷無論是最好,但一個真正容易辦法做到這一點是把你的字符串轉換成字符串流,然後讀取數據退了出來:

// warning: untested code. 
std::vector<std::string> split(std::string const &input) { 
    std::istringstream buffer(input); 
    std::vector<std::string> ret; 

    std::copy(std::istream_iterator<std::string>(buffer), 
       std::istream_iterator<std::string>(), 
       std::back_inserter(ret)); 
    return ret; 
} 

如果你願意,你可以直接從迭代器初始化vector

std::vector<std::string> split(std::string const &input) { 
    std::istringstream buffer(input); 
    std::vector<std::string> ret((std::istream_iterator<std::string>(buffer)), 
           std::istream_iterator<std::string>()); 
    return ret; 
} 

要麼應該與任何合理的C++編譯器的工作。隨着C++ 11,您可以通過使用大括號初始化,而不是一點點清理第二個版本:

std::vector<std::string> ret{std::istream_iterator<std::string>(buffer), 
           std::istream_iterator<std::string>()}; 
+0

我寧願'std :: istringstream',但不然這很好。 +1 – sbi 2010-02-16 18:34:06

7

這是我用:

/* Tokenizing a string */ 
    std::vector<std::string> Parser::tokenizer(const std::string& p_pcstStr, char delim) { 
     std::vector<std::string> tokens; 
     std::stringstream mySstream(p_pcstStr); 
     std::string   temp; 

     while(getline(mySstream, temp, delim)) { 
      tokens.push_back(temp); 
     } 

     return tokens; 
    } 

你DELIM將是一個空白, p_pcstStr將是要標記的字符串,並且返回將是一個包含所有字符串的矢量,它們之間有一個空格。

+2

+ 1用於添加分隔符參數 – crocboy 2013-07-17 15:41:40