4 Stimmen

C++ Split-String mit Leerzeichen und Interpunktionszeichen

Ich möchte eine Zeichenkette mit C++ aufteilen, die Leerzeichen und Interpunktionen enthält.

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

Ich möchte "Dies" "ist" "ein" "Hund" "Ein" "sehr" "gut" "ein" 1 von 1.

Es ist ganz einfach mit nur einem Begrenzungszeichen mit getline aber ich kenne nicht alle Begrenzungszeichen. Es können beliebige Interpunktionszeichen sein.

Hinweis: Ich möchte Boost nicht verwenden!

4voto

vmpstr Punkte 4941

Man beginnt also an der ersten Stelle und findet das erste gültige Token. Sie können verwenden

index = str.find_first_not_of (yourDelimiters);

Dann müssen Sie das erste Begrenzungszeichen danach finden, also können Sie

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

Ihr erstes Wort wird dann lauten

// since delimIndex will essentially be the length of the word
word = str.substr (index, delimIndex);

Dann schneiden Sie die Zeichenfolge ab und wiederholen sie. Sie müssen natürlich alle Fälle behandeln, in denen find_first_not_of und find_first_of npos zurückgeben, was bedeutet, dass das Zeichen nicht gefunden wurde, aber ich denke, das ist genug, um anzufangen.

Übrigens behaupte ich nicht, dass dies die beste Methode ist, aber sie funktioniert...

3voto

NFRCR Punkte 5044

Utilice std::find_if() mit einem Lambda, um das Begrenzungszeichen zu finden.

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

1voto

Satakshi Pandey Punkte 189

CPP bietet im Gegensatz zu JAVA keine elegante Möglichkeit, die Zeichenkette durch einen Begrenzer zu trennen. Sie können die Boost-Bibliothek für dasselbe verwenden, aber wenn Sie dies vermeiden wollen, würde eine manuelle Logik ausreichen.

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;

0voto

César Ortiz Punkte 301

Die Lösung von vmpstr funktioniert, könnte aber ein wenig mühsam sein. Vor einigen Monaten habe ich eine C-Bibliothek geschrieben, die das tut, was Sie wollen. http://wiki.gosub100.com/doku.php?id=librerias:c:cadenas

Die Dokumentation wurde auf Spanisch verfasst (Entschuldigung).

Es braucht keine externen Abhängigkeiten. Versuchen Sie es mit der Funktion splitWithChar().

Beispiel für die Verwendung:

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

Die ursprüngliche Zeichenkette "yourString" wird nach der Verwendung von spliWithChar() geändert, seien Sie also vorsichtig.

Viel Glück :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X