Leerzeichen entfernen



  • ich möchte das in einem code einbauen. Leder funktionert das nicht
    wenn ich eingabe: te st mache ausgabe ist test? also mit fragezeichen am ende
    aber bei der eingabe te ste n ist die ausgabe testen

    #include<iostream>
    using namespace std;
    #include<cctype>
    #include<cstring>
    
    int main(){
    
    	char str1[80];
    	char str2[80];
    	int j = 0;
    
    	cin.getline(str1,80);
    
    	for(int i = 0; str1[i] != '\0'; i++){
    
    		if(str1[i] != ' '){
    			  str2[j] = str1[i];
    		          	j +=1; 
    		}
    
    	}
    
    	cout << str2;
    	cout << endl;
    
    	return 0;
    
    }
    

  • Mod

    Wenn du statt std::string nullterminierte char-Arrays benutzt (Warum tust du das?), dann denk auch an die Nullterminierung. Die hast du hier vergessen.



  • ich enne nur das
    ist das nicht in der 17. zeile?


  • Mod

    khati schrieb:

    ich enne nur das

    Dann lern es. std::string zu kennen wird als wesentlich nützlicher und vor allem bequemer und sicherer angesehen, als sich mit den Feinheiten der char-Array-Frickelei auszukennen.

    ist das nicht in der 17. zeile?

    Ja und nein. Du hörst auf, wenn du bei der 0 in str1 ankommst, was auch richtig ist. Die Frage ist jedoch, was mit str2 ist.



  • danke. ich werde mir anschauen
    ich dachte dass j nur hochgezehlt wird wenn eine leerzeichen dabei ist und auch in 2. String gespeichert



  • dann musst du aber trotzdem noch str2 mit einer 0 abschließen solange du str2 nicht schon vorher mit 0en initialisierst.

    greetz KN4CK3R



  • Der gepostete Code ist native C. die Frage ist also hier im falschen Forum. Die objektorientierten Programmiersprachen wie C++ haben dafür gewöhnlich leicht einsetzbare Methoden.



  • Ich weiß nicht, wie lehrreich das Hantieren mit char-Arrays ist. Kann ja sein, dass man dadurch prima Programmieren lernt (Schleifen und co). Was du dabei aber leider nicht lernst, ist C++. Du lernst nur "C mit ein bisschen C++".

    In C++ musst du das Rad nämlich nicht neu erfinden, sondern kannst auf höhere Abstraktionen zugreifen. So oder so ähnlich sollte das dann auch in "echten" Programmen aussehen:

    #include <algorithm>
    #include <string>
    
    std::string strip_spaces(std::string txt)
    {
      // erase-remove idiom
      txt.erase(
        std::remove(txt.begin(),txt.end(),' '),
        txt.end()
      );
      return txt;
    }
    

    std::remove kommt aus <algorithm>. Es kopiert ein paar Zeichen (die, die übrig bleiben sollen) um und liefert die Position des neuen Endes zurück. Das erase von string löscht hier die Zeichen am Ende, die nicht mehr gebraucht werden.



  • khati schrieb:

    danke. ich werde mir anschauen
    ich dachte dass j nur hochgezehlt wird wenn eine leerzeichen dabei ist und auch in 2. String gespeichert

    j wird hochgezählt wenn du kein Leerzeichen hast.
    Bei Stringende wir die for-Schleife aber nicht mehr ausgeführt. D.H die '\0' wird nicht kopiert.
    Die musst nach der for-Schleife noch setzten.


Anmelden zum Antworten