2011-11-24 67 views
3

我有一個這樣的字符串:如何解析C++中包含空格的字符串?

aaa bbb 

有字符串的第二部分之前的空間。 我的目標是僅解析第一部分,所以aaa。 空間不足後的所有內容。我怎樣才能在C++中做到這一點?

+1

可能重複[如何記號化在C++字符串?] (http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string- in-c) –

+1

@KarlKnechtel:**錯誤的重複/不關閉**他希望第一部分,不是全部。一般令牌是這裏不必要的性能浪費。 –

+0

@phresnel我同意,但雖然這看起來像是經常被問到的事情,但我找不到更好的副本。 –

回答

9
std::string s = "aaa bbb"; 
std::string s_before_space = s.substr(0, s.find(' ')); 
+0

這是最好的解決方案。 智能,快速,清晰,非常有用。 謝謝! – user1056635

-1

用戶以下標記化器,取自此網站上的一些早期帖子。

void Tokenize(const std::string& str, std::vector<std::string>& tokens,const std::string& delimiters = " ") { 
    std::string::size_type lastPos = str.find_first_not_of(delimiters, 0); 
    std::string::size_type pos  = str.find_first_of(delimiters, lastPos); 
    while (std::string::npos != pos || std::string::npos != lastPos){ 
     tokens.push_back(str.substr(lastPos, pos - lastPos)); 
     lastPos = str.find_first_not_of(delimiters, pos); 
     pos = str.find_first_of(delimiters, lastPos); 
    } 
} 
+1

但他只想要第一部分,不是全部。這裏的一般標記化=性能浪費。 -1因爲你剛剛粘貼沒有解釋。 –

3
std::string s = "aaa bbb"; 

s = s.substr(0, s.find_first_of(' ')); 
2
std::string s = "aaa bbb"; 
std::istringstream ss(s); 

std::string token; 
if (ss>>token) // or: while(ss>>token) for _all_ tokens 
{ 
     std::cout << "first token only: " << token << std::endl; 
} 

或者,容器和使用<algorithm>

std::string s = "aaa bbb"; 
std::istringstream ss(s); 

std::vector<std::string> elements; 
std::copy(std::istream_iterator<std::string>(ss), 
      std::istream_iterator<std::string>(), 
      std::back_inserter(elements)); 

// elements now contains the whitespace delimited tokens 

包括:

#include <sstream> // for ostringstream/istringstream/stringstream 
#include <algorithm> // for copy 
#include <iterator> // for istream_iterator/back_inserter 
+0

但他只想要第一部分,不是全部。這裏的一般標記化=性能浪費。 –

+0

我嘗試了你的第二種方法;在std :: copy'調用後,該向量爲空。 – jrok

+0

@phresnel:那麼就讓它'if(ss >> token){...}'?我更喜歡str.substr(0,str.find_first_of(「\ t」))'儘管 – sehe

相關問題