Methode zum aufsplitten von strings



  • Hallo, ich habe versucht eine Methode zu schreiben, die es mir ermoeglicht, einen uebergebenen String anhand eines ebenfalls mit uebergebenen Trennzeichens zu zerschneiden und die einzelnen Stuecke in einen vector zu packen und dann zurueckzugeben. Leider funktioniert sie nicht so ganz, sie endet immer in einer Endlosschleife und ich finde einfach nicht heraus wieso. vielleicht weiss ja jemand einen Rat.

    vector<string> split(string eingabe, string trennzeichen)
    {
    	string::size_type anfang = 0; //stringstueck anfang
    	string::size_type posTrennzeichen = 0; //stringstueck ende
    	string subString; //zwischenspeicher
    	vector<string> rueckgabe; //ergebnisvector
    	posTrennzeichen = eingabe.find(trennzeichen, anfang); //position des trennzeichens bestimmen
    
    	while ( posTrennzeichen != -1 ) //solange (position des trennzeichens != -1)
    	{
    		subString=eingabe.substr(anfang, (posTrennzeichen-anfang) );//erzeugt nen substring der anfang bis zum trennzeichen enthaelt
    		rueckgabe.push_back(subString); //füge 1. Stringtueck zu rueckgabevector hinzu(von 0 bis zum trennzeichen)
    		anfang = posTrennzeichen + trennzeichen.length(); //mit posTrennzeichen hinter trennzeichen springen 
    	} // wenn der string leer ist, dann gibt das -1 (while-bedingung)
    
    	subString=eingabe.substr(anfang, (eingabe.length()-anfang)); //erstellt 2. Stringstueck 
    	rueckgabe.push_back(subString); //füge 2. Stringstück zu rueckgabevector hinzu 
    	return rueckgabe;
    }
    




  • typedef std::vector<std::string> TokenList;
    
    TokenList Tokenize
        (const std::string& str,
         const std::string& delimiters = " ")
    {
        TokenList tokens;
        //Skip leading delimiters
        string::size_type lastPos = str.find_first_not_of(delimiters, 0);
        // Find begin of first token.
        string::size_type pos     = str.find_first_of(delimiters, lastPos);
    
        while (string::npos != pos || string::npos != lastPos)
        {
            //add token to list
            tokens.push_back(str.substr(lastPos, pos - lastPos));
            // skip next set of delimiters
            lastPos = str.find_first_not_of(delimiters, pos);
            // find begin of next token
            pos = str.find_first_of(delimiters, lastPos);
        }
        return tokens;
    }
    


  • Komisch, wieso findet man die Loesungen immer dann selbst, wenn man sich dazu durchgerungen hat andere zu fragen... 😞

    so funktioniert es:

    vector<string> split(string eingabe, string trennzeichen)
    {
    	string::size_type anfang = 0; //stringstueck anfang
    	string::size_type posTrennzeichen = 0; //stringstueck ende
    	string subString; //zwischenspeicher
    	vector<string> rueckgabe; //ergebnisvector
            //#### Hier geaendert ###
    	//posTrennzeichen = eingabe.find(trennzeichen, anfang); //position des trennzeichens bestimmen
            //#### Hier geaendert ###
    	while ((posTrennzeichen = eingabe.find(trennzeichen, anfang)) != -1 ) //solange (position des trennzeichens != -1)
    	{
    		subString=eingabe.substr(anfang, (posTrennzeichen-anfang) );//erzeugt nen substring der anfang bis zum trennzeichen enthaelt
    		rueckgabe.push_back(subString); //füge 1. Stringtueck zu rueckgabevector hinzu(von 0 bis zum trennzeichen)
    		anfang = posTrennzeichen + trennzeichen.length(); //mit posTrennzeichen hinter trennzeichen springen 
    	} // wenn der string leer ist, dann gibt das -1 (while-bedingung)
    
    	subString=eingabe.substr(anfang, (eingabe.length()-anfang)); //erstellt 2. Stringstueck 
    	rueckgabe.push_back(subString); //füge 2. Stringstück zu rueckgabevector hinzu 
    	return rueckgabe;
    }
    


  • danke euch, ich wollte meine eigene Methode zum Laufen bringen, ist sonst auf die Dauer frustrierend...



  • neogeo78 schrieb:

    Komisch, wieso findet man die Loesungen immer dann selbst, wenn man sich dazu durchgerungen hat andere zu fragen...

    Liegt wahrscheinlich daran, dass man das Problem erstmalig durch die Augen eines Außenstehenden betrachtet, wenn man es für Andere formuliert.

    Genereller Tipp: Bei "Endlosschleifen" liegt der Fehler immer darin, dass die Bedingung "falsch" formuliert ist: Entweder ist sie fachlich nicht das Gewünschte oder im Schleifenrumpf werden die Varaiblen nicht korrekt gesetzt (wie bei Dir).

    Gruß,

    Simon2.


Log in to reply