2012-02-17 8 views
2

空白と句読点を含むC++を使用して文字列を分割したいと考えています。スペースと句読点を含むC++分割文字列

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

は私が取得したい「これ」「」「」「犬」「A」「とても」「良い」「1」1 1.

によっては、それはのgetlineを使用して区切り一つだけと非常に簡単ですですしかし、私はすべての区切り文字を知っているわけではありません。任意の句読記号を使用できます。

注:私はブーストを使用したくありません!

+0

あなたはすべての文字を知っていますか?あなたが手紙ではないものを見つけたら、区切り文字と見なしてください。 –

+0

[C++で文字列をどのようにトークン化するのですか?](http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c) –

答えて

2

を私はこれが最善の方法であると主張していないんだけど、それが動作します。

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

したがって、最初の位置から始めて、最初の有効なトークンを見つけます。あなたは、その後、あなたの文字列を切り捨てるそして、あなたはあなたが行うことができますので

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

あなたの最初の言葉は、その後

なり、この後の最初の区切り文字を見つける必要があり

index = str.find_first_not_of (yourDelimiters); 

を使用することができます繰り返してください。もちろん、find_first_not_ofとfind_first_of return nposのすべてのケースを処理する必要があります。これは文字が見つからなかったことを意味しますが、これで十分です。

ところで、区切り文字を見つけるために、ラムダを使用std::find_if() ...

+1

彼は知らないデリミタとしては何でしょうか。 –

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後に変更されます。

幸運:)

関連する問題