2012-02-17 132 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()修改,所以要小心。

祝你好運:)