我需要在C ++中将.
上的字符串拆分..
下面是我的字符串 -
@event.hello.dc1
现在我需要在.
上拆分上面的字符串并从中检索@event,然后将@event
传递给下面的方法 -
bool upsert(const char* key);
以下是我从here -
阅读后的代码void splitString() {
string sentence = "@event.hello.dc1";
istringstream iss(sentence);
copy(istream_iterator<string>(iss), istream_iterator<string>(), ostream_iterator<string>(cout, "\n"));
}
但我无法通过使用上述方法拆分@event
来了解如何提取.
,因为上述方法仅适用于空格...以及如何从该字符串中提取所有内容通过分割.
,如下所述 -
split1 = @event
split2 = hello
split3 = dc1
感谢您的帮助..
答案 0 :(得分:9)
您可以使用std::getline
:
string sentence = "@event.hello.dc1";
istringstream iss(sentence);
std::vector<std::string> tokens;
std::string token;
while (std::getline(iss, token, '.')) {
if (!token.empty())
tokens.push_back(token);
}
导致:
tokens[0] == "@event"
tokens[1] == "hello"
tokens[2] == "dc1"
答案 1 :(得分:1)
创建一个类似这样的ctype facet:
#include <locale>
#include <vector>
struct dot_reader: std::ctype<char> {
dot_reader(): std::ctype<char>(get_table()) {}
static std::ctype_base::mask const* get_table() {
static std::vector<std::ctype_base::mask> rc(table_size, std::ctype_base::mask());
rc['.'] = std::ctype_base::space;
rc['\n'] = std::ctype_base::space; // probably still want \n as a separator?
return &rc[0];
}
};
然后用你的实例填充你的流,并读取字符串:
istringstream iss(sentence);
iss.imbue(locale(locale(), new dot_reader())); // Added this
copy(istream_iterator<string>(iss),
istream_iterator<string>(),
ostream_iterator<string>(cout, "\n"));
答案 2 :(得分:0)
首先,您可以更改被视为流的空间。要做的是将新std::ctype<char>
中的std::locale
方面替换为新创建的imbue()
std::locale
进入流中。但是,这种方法涉及到手头的任务。实际上,要提取由.
分隔的字符串的第一个组件,我甚至不会创建一个流:
std::string first_component(std::string const& value) {
std::string::size_type pos = value.find('.');
return pos == value.npos? value: value.substr(0, pos);
}
答案 3 :(得分:-2)
您可以使用strtok函数:http://en.cppreference.com/w/cpp/string/byte/strtok 您可以通过执行以下操作来使用:
strtok(sentence.c_str(), ".");