C ++拆分带空格和标点字符的字符串

时间:2012-02-17 18:18:21

标签: c++ string

我想用C ++分割一个包含空格和标点符号的字符串。

e.g。 str = "This is a dog; A very good one."

我想要“这个”“是”“一个”“狗”“A”“非常”“好”“一个”1个1。

使用 getline 只有一个分隔符很容易,但我不知道所有的分隔符。它可以是任何标点字符。

注意:我不想使用Boost!

4 个答案:

答案 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;