Doppelte Leerzeichen For-Schleife-Problemmeldung



  • Hallo zusammen,
    ich habe eine .txt einlesen lassen und versuche nun mit dieser Schleife doppelte Leerzeichen zu entfernen

    for ( int i = 0; i < text.size(); i++ )
    {
            if ( text.at(i) == ' ' )
        {
            i++;
    
            if( text.at(i) == ' ' )
            {
                text.erase(i,1);
                i -= 1;
                }
        }
    }
    

    dann kommt diese Meldung, weiß jemand was falsch ist? gestern gings noch...

    terminate called after throwing an instance of "std:out of range" what() basic_string🇦🇹_n (which is 26) >= this->size()



  • Du inkrementierst blind i und greifst dann auf einen ungueltigen Index hinter dem Stringende zu, wenn das letzte Zeichen ein Leerzeichen ist. Loesung: Nach i++ nochmal pruefen, ob du noch im Bereich bist. Hast du uebrigens einen bestimmten Grund at statt dem [] -Operator oder gleich Iteratoren zu verwenden?



  • ja stimmt, das wars hab einen anderen Text versucht wo " " als letztes Zeichen war - danke 🙂



  • Nochmal zur Info: Das Leerzeichen zu entfernen fixt das Problem in deinem Fall aber nicht die Tatsache, dass das Programm fehlerhaft ist. Bau einfach ne Ueberpruefung ein, ob i nach dem zweiten Inkrement noch gueltig ist, oder lass es gleich nur in der For-Schleife von 0 bis size() - 2 laufen (sprich < size() - 1 ).



  • danke dir, warum entfernt das Programm jetzt aber nicht meine doppelten Leerzeichen? Irgendwie funktioniert es nicht mehr richtig



  • Kannst du mal bitte deinen aktuellen Code zeigen?



  • ich hab im Moment nur den oberen Code versucht ohne Leerzeichen im Textende und er funktioniert nicht. er stürzt jetzt zwar nicht ab, aber funktioniert auch nicht. Überprüfung bau ich dann ein, wenn ich weiß dass die Schleife überhaupt noch funktioniert



  • Warum benutzt du nicht einfach string.find()?

    #include <string>
    #include <algorithm>
    #include <iostream>
    
    void removeMultipleSpaces(std::string& str)
    {
    	auto pos = str.find("  ");
    
    	while(pos != std::string::npos)
    	{
    		str.erase(pos, 1);
    
    		pos = str.find("  ");
    	}
    }
    
    int main()
    {
    	std::string str = "Hallo,  Welt!  Das  ist ein  Test  \n";
    
    	std::cout << str;
    
    	removeMultipleSpaces(str);
    
    	std::cout << str;
    }
    


  • das funktioniert nicht str



  • "Funktioniert nicht " ist keine Fehlerbeschreibung.



  • manni66 schrieb:

    "Funktioniert nicht " ist keine Fehlerbeschreibung.

    sorry er meldet: auto pos nicht gefunden



  • Mondblume schrieb:

    manni66 schrieb:

    "Funktioniert nicht " ist keine Fehlerbeschreibung.

    sorry er meldet: auto pos nicht gefunden

    Die Meldung ist aber auch nicht vollständig.

    Vielleicht solltest du einen aktuellen Compiler verwenden oder ihm sagen, dass er nach dem aktuellen Standard ableiten soll.

    Probiere std::size_t statt auto, das sollte auch ein veralteter Compiler verarbeiten.



  • Danke mit std::size_t geht es 👍 und danke auch an str.


Log in to reply