我想用C ++分割一个包含空格和标点符号的字符串。
e.g。 str = "This is a dog; A very good one."
我想要“这个”“是”“一个”“狗”“A”“非常”“好”“一个”1个1。
使用 getline 只有一个分隔符很容易,但我不知道所有的分隔符。它可以是任何标点字符。
注意:我不想使用Boost!
答案 0 :(得分:3)
因此,从第一个位置开始,您会找到第一个有效令牌。你可以使用
index = str.find_first_not_of (yourDelimiters);
然后你必须在此之后找到第一个分隔符,所以你可以做到
delimIndex = str.substr (index).find_first_of (yourDelimiters);
您的第一个单词将是
// since delimIndex will essentially be the length of the word
word = str.substr (index, delimIndex);
然后你截断你的字符串并重复。当然,你必须处理find_first_not_of和find_first_of返回npos的所有情况,这意味着找不到字符,但我认为这足以开始。
是的,我并没有声称这是最好的方法,但它有效......答案 1 :(得分:2)
将std::find_if()
与lambda一起使用以查找分隔符。
auto it = std::find_if(str.begin(), str.end(), [] (const char element) -> bool {
return std::isspace(element) || std::ispunct(element);})
答案 2 :(得分:0)
vmpstr的解决方案有效,但可能有点单调乏味。 几个月前,我写了一个C库来做你想要的。 http://wiki.gosub100.com/doku.php?id=librerias:c:cadenas
文档已用西班牙语写成(抱歉)。
它不需要外部依赖项。尝试使用splitWithChar()函数。
使用示例:
#include "string_functions.h"
int main(void){
char yourString[]= "This is a dog; A very good one.";
char* elementsArray[8];
int nElements;
int i;
/*------------------------------------------------------------*/
printf("Character split test:\n");
printf("Base String: %s\n",yourString);
nElements = splitWithChar(yourString, ' ', elementsArray);
printf("Found %d element.\n", nElements);
for (i=0;i<nElements;i++){
printf ("Element %d: %s\n", i, elementsArray[i]);
}
return 0;
}
使用spliWithChar()后修改原始字符串“yourString”,所以要小心。
祝你好运:)答案 3 :(得分:0)
CPP与JAVA不同,它没有提供一种用分隔符分割字符串的优雅方法。您可以使用boost库,但如果要避免使用boost库,则只需手动逻辑即可。
vector<string> split(string s) {
vector<string> words;
string word = "";
for(char x: s) {
if(x == ' ' or x == ',' or x == '?' or x == ';' or x == '!'
or x == '.') {
if(word.length() > 0) {
words.push_back(word);
word = "";
}
}
else
word.push_back(x);
}
if(word.length() > 0) {
words.push_back(word);
}
return words;