Folge von Leerzeichen durch ein Leerzeichen ersetzen



  • Hallo zusammen,

    Da ich kommendes Semester Systemprogrammierung habe, möchte ich mich schon bisschen mit c beschäftigen. Da gibt es eine Übung zu getchar().

    Und zwar ist das ein Kopierprogramm, welches eine Folge von Leerzeichen in der Eingabe durch ein einzelnes Leerzeichen in der Ausgabe ersetzt. Habe schon folgendes kleines Codeschnipsel:

    #include <stdio.h>
    main()
    {
      while((c = getchar()) != EOF)
      {
        if(c == ' ')
      }
    }
    

    Ich weiss da jetzt nicht mehr weiter. Muss ich mir da erst einen String zusammen bauen und mir dann alle Leerzeichen merken ? Und wie kann ich die dann ersetzen ?
    Wäre für Tips von den Experten sehr dankbar

    Viele Grüsse
    Moony



  • bool wir_sind_gerade_in_einer_leerzeichenkette = false;
    
    while((c = getchar()) != EOF) {
        if(c == ' ') {
            if(wir_sind_gerade_in_einer_leerzeichenkette == false) {
                // dies ist das erste leerzeichen
                wir_sind_gerade_in_einer_leerzeichenkette = true;
    
                // dieses leerzeichen also in den outputstream schreiben
            } else {
                // hier kam direkt davor schonmal ein leerzeichen, nichts in den outputstream schreiben
            }
        } else {
            // c != ' '
            if(wir_sind_gerade_in_einer_leerzeichenkette == true)
                wir_sind_gerade_in_einer_leerzeichenkette = false; // wieder zurücksetzen
    
            // und natürlich dieses byte auch in den outputstream schreiben...
        }
    }
    


  • Moonwalker schrieb:

    Und zwar ist das ein Kopierprogramm, welches eine Folge von Leerzeichen in der Eingabe durch ein einzelnes Leerzeichen in der Ausgabe ersetzt.

    kein C, aber dafür kurz:

    sed 's/\ \ */\ /g'
    


  • wohin soll den die eingabe gehen`? auffn schierm oder in eine variable?



  • Das ist mit Standard-C wunderschön zu lösen, da brauchst Du nichts Unix-spezifisches.



  • Dieser Thread wurde von Moderator/in nman aus dem Forum Linux/Unix in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Guten Morgen,

    erstmal danke, für die vielen Antworten und Denkanstöße.
    Die Ausgabe habe ich mit Putchar realisiert.
    Habe jetzt den Code von Heinzelotto hergenommen und bisschen verändert, da der Datentyp Bool wohl nicht erkannt wurde 😞

    Das Prog sieht jetzt folgendermaßen aus (und funktioniert sogar :)):

    #include <stdio.h>
    
    main()
    {
    	int c;
    	int state = 0;
    
    	while((c = getchar()) != EOF)
    	{
    		if( c == ' ')
    		{
    			state++;
    			if(state  == 1)
    			{
    				putchar(c);
    			}
    		}
    		else
    		{
    			putchar(c);
    			state = 0;
    		}
    	}
    }
    

    Naja, vielleicht kann man das ja auch noch eleganter lösen?

    Dann noch eine weitere Frage. Nman hat was von Standard-C geschrieben. Wo genau unterscheidet sich das dann von Unix-spezifischen? In Systemfunktionen wie z.B Folk() oder einfach nur in Compilervorgänge, Einstellungen, Editor?

    Wie ist das eigentlich. Ich schreibe die C Programme unter Debian- Linux und übersetze diese mit cc. Unter Windows läuft das kleine Progämmchen ja nicht :(. Brauch ich da einen anderen Compiler für Windows?

    Sorry für meine Unwissenheit. Habe bisher nur unter Windows mit Java und c# gearbeitet.

    Thx!
    Viele Grüsse
    Moony



  • Eleganter? Eleganz ist eher Geschmackssache, ne.
    Was hältst du hiervon:

    int c=0;
    while ((c=getchar())!='\n')
    {
    	putchar(c);
    	if (c==' ')
    	{
    		while ((c=getchar())==' ');
    		ungetc(c,stdin);
    	}
    }
    

    Beachte, das die while Schleifen in Zeile sieben keine geschweiften Klammern
    hat.

    Standard C Funktionen sind diejenigen, die in der Standard C Bibliothek sind. http://de.wikipedia.org/wiki/Standard_C_Library
    Für Windows brauchst du einen Windows-Compiler. Es gibt auch nen gcc für
    Windows.

    Gruß,
    B.B.



  • Big Brother schrieb:

    Eleganter? Eleganz ist eher Geschmackssache, ne.
    Was hältst du hiervon:

    int c=0;
    while ((c=getchar())!='\n')
    {
    	putchar(c);
    	if (c==' ')
    	{
    		while ((c=getchar())==' ');
    		ungetc(c,stdin);
    	}
    }
    

    Beachte, das die while Schleifen in Zeile sieben keine geschweiften Klammern
    hat.

    schreib dir warnung doch gleich in den code.

    int c=0;
    while ((c=getchar())!='\n')
    {
    	putchar(c);
    	if (c==' ')
    	{
    		while ((c=getchar())==' ')
    			;
    		ungetc(c,stdin);
    	}
    }
    


  • Super, danke euch 🙂
    Das war es vor erst 😉

    Viele Grüsse
    Moonwalker


Anmelden zum Antworten