2011-03-02 36 views
47

在C++中分割字符串的最佳方法?該字符串可以被假定爲由分隔符;分隔的單詞組成。使用令牌分割C++ std :: string,例如「;」

從我們的引導線的角度來看,C字符串函數是不允許的,也不允許使用Boost,因爲安全問題不允許使用開源。

最好的解決方案我現在的問題是:

string str("denmark;sweden;india;us"); 

以上str應存放在向量作爲字符串。我們怎樣才能做到這一點?

感謝您的意見。

+1

我不認爲這應該被標記爲重複,另一個問題促進優雅而不是效率,這是我不同意和爲此避免的。 – user2462027 2014-12-12 07:51:09

回答

112

我找到的std ::函數getline()往往是最簡單的。可選的分隔符參數意味着它不只是閱讀「行」:

#include <sstream> 
#include <iostream> 
#include <vector> 

using namespace std; 

int main() { 
    vector<string> strings; 
    istringstream f("denmark;sweden;india;us"); 
    string s;  
    while (getline(f, s, ';')) { 
     cout << s << endl; 
     strings.push_back(s); 
    } 
} 
+3

+1:哇,從來沒有考慮過使用'getline'和'istringstream'。 – 2011-03-02 19:04:36

+0

這裏有很多類似的問題,但這種方法似乎對我來說最爲方便。非常好! – 2013-03-05 07:38:40

+0

我一直在尋找這樣的方法幾天。非常感謝 !! – 2017-05-30 05:39:05

7

您可以使用字符串流並將元素讀入向量。

Here有許多不同的例子...

的例子之一的副本:

std::vector<std::string> split(const std::string& s, char seperator) 
{ 
    std::vector<std::string> output; 

    std::string::size_type prev_pos = 0, pos = 0; 

    while((pos = s.find(seperator, pos)) != std::string::npos) 
    { 
     std::string substring(s.substr(prev_pos, pos-prev_pos)); 

     output.push_back(substring); 

     prev_pos = ++pos; 
    } 

    output.push_back(s.substr(prev_pos, pos-prev_pos)); // Last word 

    return output; 
} 
+0

可以給我一個例子 – venkysmarty 2011-03-02 12:46:31

+0

在鏈接提供的空間被用作分隔符我怎樣才能指定「;」作爲分隔符 – venkysmarty 2011-03-02 12:48:35

+1

有很多例子,其中一些是空間分隔符,另一些是分隔符。 – Fox32 2011-03-02 12:49:49

6

有幾個可用的庫解決這個問題,但最簡單的可能是使用升壓標記生成器:

#include <iostream> 
#include <string> 
#include <boost/tokenizer.hpp> 
#include <boost/foreach.hpp> 

typedef boost::tokenizer<boost::char_separator<char> > tokenizer; 

std::string str("denmark;sweden;india;us"); 
boost::char_separator<char> sep(";"); 
tokenizer tokens(str, sep); 

BOOST_FOREACH(std::string const& token, tokens) 
{ 
    std::cout << "<" << *tok_iter << "> " << "\n"; 
}