2012-02-17 134 views
2

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

例如str = "This is a dog; A very good one."

我想要得到的“这”“是”“一”“狗”“A”“非常”“好”“” 1加1

一个它只有一个很简单的分隔符使用函数getline但我不知道所有的分隔符。它可以是任何标点符号。

注意:我不想使用Boost!

+0

你知道所有的字母,对吗?因此,如果您发现任何不是字母的内容,请将其视为分隔符。 – 2012-02-17 18:32:19

+0

可能的重复[如何在C++中标记字符串?](http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c) – 2012-02-17 19:05:51

回答

2

使用std::find_if()与拉姆达找到的分隔符。

auto it = std::find_if(str.begin(), str.end(), [] (const char element) -> bool { 
         return std::isspace(element) || std::ispunct(element);}) 
3

因此,从第一个位置开始,您会找到第一个有效的标记。您可以使用

index = str.find_first_not_of (yourDelimiters); 

然后你必须找到在此之后的第一个分隔符,所以你可以做

delimIndex = str.substr (index).find_first_of (yourDelimiters); 

那么你的第一个字是

然后删掉你的字符串并重复。当然,您必须处理find_first_not_of和find_first_of返回npos的所有情况,这意味着该字符未找到,但我认为这足以开始。

顺便说一句,我并不是说这是最好的方法,但它的工作原理...

+1

他不知道什么将作为分隔符。 – 2012-02-17 18:34:14

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; 
} 

原始字符串 “yourString” 被使用后spliWithChar()修改,所以要小心。

祝你好运:)