Problem mit : "getchar()" und "EOF"



  • Hi,

    ich will die Programmiersprache C erlernen und habe mir dazu den Klassiker Programmieren in C von Kernighan and Ritchie gekauft.
    Problem bereiten mir "getchar()" und "EOF". Diese Befehle kommen dauernd in diesem Buch vor, wirken aber auf mich sehr veraltet und suspekt. Ich kann dann zwar diese Programme compilieren, jedoch wenn ich mein Programm ausführe passiert gar nichts bzw. es reagiert nicht. Kann ich diese Befehle irgenwie vermeiden ? Gibt es Substionsbefehle ? Brauche ich eine alten Compiler(ich benutze DEV)? Mache ich was falsch ? Der folgende Code ist ein Bsp. aus dem Buch.

    #include <stdio.h>
    
    main()
    {
        int c, i, nwhite, nother;
        int ndigit[10];
    
        nwhite = nother = 0;
        for(i = 0; i < 10; ++i)
           ndigit[i] = 0;
    
        while((c = getchar()) != EOF) 
            if(c >= '0' && c <= '9')
               ++ndigit[c-'0'];
            else if (c == ' ' || c == '\n' || c == '\t')
               ++nwhite;
            else 
               ++nother;
    
        printf("digits =");       
        for(i = 0; i < 10; ++i)
           printf(" %d", ndigit[i]);
        printf(", white space = %d, other = %d\n", nwhite, nother);   
    }
    

    Ich hoffe es kann mir jemand helfen.

    MfG Mutabor



  • Was heißt "passiert nichts"? Du musst natürlich auch etwas eingeben 🙄

    Und getchar/EOF sind nicht veraltet. Wie kommst du auf so etwas?



  • Ich meine nach meiner Eingabe passiert nichts. Ich kann endlos Zahlen eingeben und nichts passiert.

    Zum Thema veraltet : Ich habe mir die Eingabe wesentlich professioneller vor gestellt, sowie z.B. bei Java. Aber Java ist eben eine Objektorientierte Programmiersprache. Tja falsch gedacht. 🙄



  • Mal davon abgesehen dass die Eleganz nichts mit der Objektorientierung zu tun hat - sendest du denn auch ein EOF Zeichen? Wenn ja: wie machst du es. uU liegt ja dort der Fehler.



  • EOF ist kein char-Wert und kann auch nicht gesendet werden. getchar() liefert diesen Wert zurück, wenn die Konsole abgeschossen wurde (das erreichst du afair mit Strg+C - aber danach kannst du mit dem Programm nicht mehr viel anfangen). Da ist es wohl günstiger, dir ein eigenes Kriterium auszudenken, wann die Eingabe beendet werden soll.



  • CStoll schrieb:

    EOF ist kein char-Wert und kann auch nicht gesendet werden.

    doch: ctrl-Z oder ctrl-D, 0x1a, 26 😉



  • pale dog schrieb:

    CStoll schrieb:

    EOF ist kein char-Wert und kann auch nicht gesendet werden.

    doch: ctrl-Z oder ctrl-D, 0x1a, 26 😉

    Es hat schon einen Grund, warum getchar() einen int zurückgibt und keinen char - es gibt keinen char-Wert, der als Kandidat für die "Datei ist zu Ende"-Kennzeichnung verwendet werden könnte, darum liegt EOF außerhalb des char-Wertebereiches. Eingaben wie Strg+Z klemmen stdin von der Tastatur ab und bewirken damit den selben Effekt wie das Dateiende einer "normalen" Datei (vermutlich werden irgendwo in der FILE-Struktur einige Fehlerflags gesetzt).



  • sendest du denn auch ein EOF Zeichen?

    Ich gebe Zahlen ein. Ist das falsch ?

    EOF ist kein char-Wert und kann auch nicht gesendet werden. getchar() liefert diesen Wert zurück, wenn die Konsole abgeschossen wurde (das erreichst du afair mit Strg+C - aber danach kannst du mit dem Programm nicht mehr viel anfangen). Da ist es wohl günstiger, dir ein eigenes Kriterium auszudenken, wann die Eingabe beendet werden soll

    Wie ? Welches Kriterium ?



  • CStoll: das mit EOF passt schon, er speichert den wert ja in einem int.

    Mutabor: wenn du nur zahlen eingibst, sendest du ja nie das EOF Zeichen. Du musst deinem Programm ja irgendwann sagen, dass du jetzt keine weiteren zahlen eingeben willst.

    Das EOF Zeichen sendet man unter Windows mit Strg+Z und unter Linux mit Strg+D


Anmelden zum Antworten