Finde den Fehler nicht :-(



  • Hallo zusammen, ich versuche gerade ein Programm zu schreiben welches die Leerzeichen aus einem char Array entfernt. Irgendwie klappt das ganze jedoch nicht und ich bin so langsam mit meinem Latein (c++) am ende.

    Vielleicht kann mir da ja jemand weiterhelfen :

    [cpp]void eatspace(char *cterm)
    {
    	int j = 0;
    	for(int i = 0;i < (sizeof cterm / sizeof cterm[0]);i++)
    	{
    		if(cterm[i] == '\0')
    		break;
    		else if(cterm[i] != ' ')
    			cterm[j++] = cterm[i];
    	}
    }[/cpp]
    

    Aufruf erfolgt dann entsprechend über

    eatspace(&cterm[imax]);

    Danke



  • sizeof(cterm) liefert nur dann das "richtige" Ergebnis, wenn du das Array "vor Ort" hast - du hast aber nur einen Zeiger auf das Array (und bei deinem Aufruf hast du sogar einen Zeiger auf das Array-Ende). Wenn du die Länge des Strings wissen willst, nimm lieber strlen() - oder noch besser, du arbeitest gleich mit std::string.



  • 1. Der Aufruf sieht falsch aus - wenn imax die Länge des Arrays ist, wäre &cterm[imax] ein Zeiger hinter das Array. Ich denke Du willst einfach cterm (oder &cterm[0]).
    2. sizeof cterm in der Funktion ist 4. Immer. Du musst die Länge entweder mit übergeben oder erneut errechnen. Dann kann aber die Abfrage auf '\0' entfallen.
    3. Ganz am Schluß solltest Du an die Position j noch ein '\0' setzen, um den neuen String abzuschließen.

    Und da wir im C++-Forum sind, könnte man das ganze gleich noch mit std::string machen 😃



  • Danke nu geht alles !



  • CStoll schrieb:

    sizeof(cterm) liefert nur dann das "richtige" Ergebnis, wenn du das Array "vor Ort" hast ...

    Anders gesagt: Der "sizeof(Array)/sizeof(Element)"-Trick funktioniert eben nur mit (qualifizierten) Arrays ... und nicht mit Zeigern. 😃

    Gruß,

    Simon2.



  • void erase_space(char* str)
    {
        std::size_t pos_cur(0);
        for (std::size_t i(0); i < std::strlen(str); ++i)
            if (str[i] != ' ')
                str[pos_cur++] = str[i];
    }
    

    wenn der Rest von deinem Code stimmte, dann ist das so korrekt 😛



  • ... oder mit C++ ganz sprechend:

    string s = "Man schaut    mal was m i t   le er     zeichen    ";
       s.erase(remove_if(s.begin(), s.end(),bind2nd(equal_to<char>(), ' ')), s.end());
    

    😉

    Gruß,

    Simon2.


Anmelden zum Antworten