在dot上拆分字符串并在C ++中从中检索每个值

Split the string on dot and retrieve each values from it in C++

我需要在EDCOX1的0中分离字符串。

下面是我的绳子-

@event.hello.dc1

现在我需要在上面的字符串上拆分.并从中检索@event,然后将@event传递给下面的方法-

bool upsert(const char* key);

下面是我从这里读到的代码-

1
2
3
4
5
6
7
8
void splitString() {

    string sentence ="@event.hello.dc1";

    istringstream iss(sentence);
    copy(istream_iterator<string>(iss), istream_iterator<string>(), ostream_iterator<string>(cout,"
"
));
}

但我不知道如何用上述方法对.进行拆分提取@event,因为上述方法只对空白区有效。以及如何通过在.上拆分从该字符串中提取所有内容,如下所述-

1
2
3
split1 = @event
split2 = hello
split3 = dc1

谢谢你的帮助。


您可以使用std::getline

1
2
3
4
5
6
7
8
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);
}

结果是:

1
2
3
tokens[0] =="@event"
tokens[1] =="hello"
tokens[2] =="dc1"


创建一个ctype方面,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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['
'
] = std::ctype_base::space; // probably still want
 as a separator?
        return &rc[0];
    }
};

然后在流中嵌入一个实例,并读取字符串:

1
2
3
4
5
6
7
8
istringstream iss(sentence);

iss.imbue(locale(locale(), new dot_reader())); // Added this

copy(istream_iterator<string>(iss),
     istream_iterator<string>(),
     ostream_iterator<string>(cout,"
"
));


首先,您可以更改被认为是流空间的内容。方法是在新的std::locale中替换std::ctype面,然后将新创建的std::locale面放入流中。然而,这种方法有点涉及手头的任务。实际上,要提取由.分隔的字符串的第一个组件,我甚至不会创建流:

1
2
3
4
std::string first_component(std::string const& value) {
    std::string::size_type pos = value.find('.');
    return pos == value.npos? value: value.substr(0, pos);
}

您可以使用strtok函数:http://en.cppreference.com/w/cpp/string/byte/strtok您可以通过这样的操作来使用:

1
 strtok(sentence.c_str(),".");