2011-04-20 64 views
38

我使用boost::split方法來分割字符串作爲這樣的:C++助推分割字符串

我首先要確保包括正確的頭能夠訪問boost::split

#include <boost/algorithm/string.hpp> 

則:

vector<string> strs; 
boost::split(strs,line,boost::is_any_of("\t")); 

時線路等

"test test2 test3" 

這是我如何消費的結果字符串向量:

void printstrs(vector<string> strs) 
{ 
    for(vector<string>::iterator it = strs.begin();it!=strs.end();++it) 
    { 
     cout << *it << "-------"; 
    } 

    cout << endl; 
} 

但爲什麼在結果strs我只得到"test2""test3",不應該是"test""test2""test3",有\t(標籤)的字符串。

更新於2011年4月24日:似乎在我改變了一行代碼printstrs我可以看到第一個字符串。我改變

cout << *it << "-------"; 

cout << *it << endl; 

,似乎"-------"覆蓋的第一串莫名其妙。

+4

顯示你如何使用矢量。我猜這個問題在那裏。 – 2011-04-20 17:44:11

+9

'boost :: is_any_of(「\ t」)'效率低於'[](char c){return c =='\ t';}'。你只是想檢查一個可能性。 (不知道爲什麼沒有提升:是('\ t')') – MSalters 2013-08-26 10:33:35

+0

@MSalters評論中的代碼是什麼意思?我如何使用該代碼來替代'boost :: is_any_of()'? – 2016-08-05 18:22:10

回答

52

問題是,別的地方在你的代碼,因爲這個工程:

string line("test\ttest2\ttest3"); 
vector<string> strs; 
boost::split(strs,line,boost::is_any_of("\t")); 

cout << "* size of the vector: " << strs.size() << endl;  
for (size_t i = 0; i < strs.size(); i++) 
    cout << strs[i] << endl; 

和測試方法,它採用了矢量迭代器也可以工作:

string line("test\ttest2\ttest3"); 
vector<string> strs; 
boost::split(strs,line,boost::is_any_of("\t")); 

cout << "* size of the vector: " << strs.size() << endl; 
for (vector<string>::iterator it = strs.begin(); it != strs.end(); ++it) 
{ 
    cout << *it << endl; 
} 

同樣,你的問題是什麼地方其他。也許你認爲是字符串上的\t字符,不是。我會用調試來填充代碼,首先監視向量上的插入操作,以確保所有內容都按照其應有的方式插入。

輸出:

* size of the vector: 3 
test 
test2 
test3 
+2

如果您不會分享一個能夠再現您所面臨問題的最簡單示例,那麼我們無能爲力。記住:最小的例子,而不是你的完整應用程序。 – karlphillip 2011-04-20 18:21:44

+0

@icn任何更新在你身邊? – karlphillip 2011-04-21 03:13:25

+0

謝謝。它似乎我改變了cout << * it <<「-------」以cout << * it << endl;我可以看到第一個字符串。不知道爲什麼,它看起來「-------」覆蓋了第一個字符串 – icn 2011-04-25 04:39:02

10

在爲什麼你不得不與-----覆蓋你的第一個結果的問題我最好的猜測是,你實際上從文件中讀取輸入行。則該行可能有一個\ r上結束,所以你結束了這樣的事情:

-----------test2-------test3

發生了什麼是真正的印刷本機:

test-------test2-------test3\r-------

也就是說,因爲在test3結束時回車,test3之後的破折號被打印在第一個單詞的頂部(以及test和test2之間的一些現有破折號,但是您不會注意到,因爲它們已經是破折號)。