Datei kopieren und dabei überflüssige Leerzeichen entfernen



  • Hey, ich habe folgende Aufgabe: Schreiben Sie ein Programm, das seine Standardeingabe in die Standardausgabe kopiert und
    dabei jede Folge von Leerzeichen und Tabulatorzeichen durch ein einzelnes Leerzeichen ersetzt.

    Ich habe dafür die Funktion isspace aus der ctype.h benutzt und habe mein programm so geschrieben, dass es kein zeichen ausgibt, falls es sich bei dem zeichen um das mindestens zweite Leerzeichen space in Folge handelt handelt. Trotzdem ist meine Output Datei voller Leerzeichenfolgen. Könnt ihr mir bitte helfen, wo ich etwas falsch gemacht habe. danke im voraus!

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


  • int main(int argc, char **argv) {
    

    Bei mir funktionierts perfekt.



  • Bist Du sicher, dass Du richtig testest?
    Sieht eigentlich gut aus - bis auf den fehlenden Rückgabetyp von main() .

    Und evtl. ist isspace() nicht geeignet, weil es viel mehr Zeichen als nur Leerzeichen und horizontale Tabs erkennt.
    Aber prinzipiell eine gute Idee die Standardbibliothek zu benutzen! 👍

    Zu spät... 😞


  • Mod

    Singender Holzkübel schrieb:

    int main(int argc, char **argv) {
    

    Furble Wurble schrieb:

    Sieht eigentlich gut aus - bis auf den fehlenden Rückgabetyp von main() .

    C-Forum, kein C++ 🙂 . Hier ist default-int erlaubt (wenn auch nicht gern gesehen).



  • Furble Wurble schrieb:

    Zu spät... 😞

    Besser als gar nicht 🙂



  • SeppJ schrieb:

    C-Forum, kein C++ 🙂 . Hier ist default-int erlaubt (wenn auch nicht gern gesehen).

    Unglaublich! SeppJ goes Haarspalterei... 🙂

    Aber einen habe ich noch für den OP: seit C99 gibt es auch isblank() .



  • danke erstmal für eure posts! nun, ich hab jetzt die main funktion angepasst

    int main(int argc, char **argv) {
    

    Trotzdem bleibts dabei, dass Eingabedatei = Ausgabedatei ist.

    Eingabedatei sieht bei mir so aus:

    #include <stdio.h>
    #include <stdio.h>
    
    int main (int argc, char **argv) {
    
    putchar('T');
    putchar('H');
    putchar('I');
    putchar('S');
    putchar(' ');
    putchar(' ');
    putchar('i');
    putchar('s');
    putchar(' ');
    putchar(' ');
    putchar(' ');
    putchar(' ');
    putchar('E');
    putchar('A');
    putchar('S');
    putchar('Y');
    
    return (0);
    system("pause");
    }
    

    Ich seh mit den Rückgabewerten noch nicht ganz durch. Ist da der Fehler?



  • und in der Kommandozeile schreibe ich dann: isspace < easy.c > peasy.c

    die neu angelegte peasy.c sieht leider genauso aus wie easy.c


  • Mod

    Das gezeigte Programm ist absolut in Ordnung, daher können wir nichts zu irgendwelchen Fehlerursachen sagen. Wir können höchstens spekulieren, dass du irgendwie falsch testest (siehe zweite Antwort im Thread). Guckst du (1:1 dein Programm mit deiner Eingabe):
    https://ideone.com/bCzCA6
    Wie du siehst, entspricht die Ausgabe den Anforderungen.



  • Wo ist denn in der Eingabedatei mehr als ein Leerzeichen hintereinander?

    Nimm mal deinen Quellcode von deinem Programm.


  • Mod

    taka99 schrieb:

    und in der Kommandozeile schreibe ich dann: isspace < easy.c > peasy.c

    die neu angelegte peasy.c sieht leider genauso aus wie easy.c

    Das ist der Fehler. Dein Programm liest von der Standardeingabe und schreibt in die Standardausgabe. Dein Programm interessiert sich nicht für Dateien. Und deine easy.c selbst enthält auch gar keine mehrfachen Leerzeichen. Ich bin irgendwie schwer verwirrt. Hast du den Code gar nicht selber geschrieben? Das wirkt so, als würdest du nicht verstehen, was dein eigenes Programm macht.



  • na vor "is" sind doch zwei Leerzeichen und vor "easy" sind drei?!



  • SeppJ schrieb:

    taka99 schrieb:

    und in der Kommandozeile schreibe ich dann: isspace < easy.c > peasy.c

    die neu angelegte peasy.c sieht leider genauso aus wie easy.c

    Das ist der Fehler. Dein Programm liest von der Standardeingabe und schreibt in die Standardausgabe. Dein Programm interessiert sich nicht für Dateien. Und deine easy.c selbst enthält auch gar keine mehrfachen Leerzeichen. Ich bin irgendwie schwer verwirrt. Hast du den Code gar nicht selber geschrieben? Das wirkt so, als würdest du nicht verstehen, was dein eigenes Programm macht.

    doch na klar habe ich den selber geschrieben.
    "mein programm interessiert sich nicht für dateien" ??
    wieso enthält easy.c nicht mehrere leerzeichen??
    ist putchar(' '); nicht die Ausgabe eines Leerzeichens??

    jetzt bin ich verwirrt 🙄



  • taka99 schrieb:

    na vor "is" sind doch zwei Leerzeichen und vor "easy" sind drei?!

    😮

    Du gibst deinem Programm den ganzen Code von easy.c zum prüfen.
    Der ganze Text wird geprüft. Also vom # bis zur }.

    Was du machen willst ist:
    easy | isspace > peasy.out



  • oha...jetzt klingelts!



  • Oder isspace < isspace.c > isspace.txt



  • wie peinlich! jetzt funktionierts natürlich. danke jungs (oder mädels)


  • Mod

    taka99 schrieb:

    doch na klar habe ich den selber geschrieben.
    "mein programm interessiert sich nicht für dateien" ??
    wieso enthält easy.c nicht mehrere leerzeichen??
    ist putchar(' '); nicht die Ausgabe eines Leerzeichens??

    Das ist ja schön, dass putchar(' ') ein Leerzeichen ausgibt, dadurch enthält der Text " putchar(' '); putchar(' '); " selbst aber immer noch nicht mehrere Leerzeichen nacheinander.



  • jetzt hab ichs verstanden 😃
    da waren ein paar synapsen bei mir verklebt



  • Es gibt da noch eine Schwachstelle im Code: das Inkrementieren der Variablen a beim Auftreten von Space könnte bei großen Datenmengen zu negativen Werten und damit zur Ausgabe unerwünschter Spaces führen. Dies könnte ganz einfach verhindert werden, wenn a nur als Flag, z.B. mit den Werten 0 oder 1, benutzt würde.


Log in to reply