如何解析C++中包含空格的字符串?
问题描述:
我有一个这样的字符串:如何解析C++中包含空格的字符串?
aaa bbb
有字符串的第二部分之前的空间。 我的目标是仅解析第一部分,所以aaa
。 空间不足后的所有内容。我怎样才能在C++中做到这一点?
答
std::string s = "aaa bbb";
std::string s_before_space = s.substr(0, s.find(' '));
+0
这是最好的解决方案。 智能,快速,清晰,非常有用。 谢谢! – user1056635
答
用户以下标记化器,取自此网站上的一些早期帖子。
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因为你刚刚粘贴没有解释。 –
答
std::string s = "aaa bbb";
s = s.substr(0, s.find_first_of(' '));
答
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
的
可能重复[如何记号化在C++字符串?] (http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string- in-c) –
@KarlKnechtel:**错误的重复/不关闭**他希望第一部分,不是全部。一般令牌是这里不必要的性能浪费。 –
@phresnel我同意,但虽然这看起来像是经常被问到的事情,但我找不到更好的副本。 –