C Programm - for-Schleife wird nicht verlassen

Bradlay

Mitglied
Hi @ all!

Ein kleines C-Programm, dass nicht so funktioniert wie es sollte.

Ich lese gerade ein Buch über C Programmierung und der folgende Code ist auch daraus.
Code:
#include <stdio.h>
/*Eingabezeichen zaehlen*/
main()
{
      double nc;
      
      for (nc=0; getchar() != EOF; ++nc)
      ; //leere Anweisung
      
      printf("%.0f\n", nc);
}

Dieses kleine Porgramm sollte eigentlich alle eingegebenen Zeichen zählen und die Zahl
ausgeben.
Nun ist es aber so, dass ich ein Wort eingeben kann und dann Enter drücke aber printf nicht ausgeführt wird. Ich kann einfach wieder nur ein neues Wort eingeben und das wars. Mit ctrl+C Beendet erst das Programm.
Ich habe es auch schon mit den geschweiften Klammern bei der for-Schleife probiert,
welche ja jetzt hier nich zwingend notwendig sind. Ich habe das ganze auch schon mit einer while-Schleife probiert.

Ich benutze zum schreiben und übersetzen Dev-C++, habe es aber auch schon mit DJGPP probiert...

Hat jemand von euch vieleicht eine Idee wo der Fehler ist?
Oder habe ich jetzt da nur einen Denkfehler oder ein falsche Vorstellung davon, was das Programm machen sollte?

Danke schon mal im Vorraus...
 
Die Lösung ist ganz einfach. Teste nicht auf != EOF (End of File... und du benutzt ja keine Dateien) sondern auf != ASCII von Enter => getchar() != 13
 
Hallo,

Die Lösung ist ganz einfach. Teste nicht auf != EOF (End of File... und du benutzt ja keine Dateien) sondern auf != ASCII von Enter => getchar() != 13
13 ist allerdings der ASCII-Code des Zeilenrücklaufs (CR, Carriage Return). Ein Zeilenumbruch (Line Feed, LF) wäre ASCII 10. Dass EOF nur in Verbindung mit Dateien verwendet werden kann, stimmt übrigens nicht. Auch die Standardeingabe sendet dieses Signal, wenn keine weiteren Zeichen verfügbar sind. Bei Tastatureingaben in einer Shell kann man dies beispielsweise mit Strg+Z (Windows) bzw. Strg+D (Linux) erzwingen.

@Bradlay: Warum verwendest du zum Zählen der Zeichen den (ungenauen) Datentyp double?

Grüße,
Matthias
 
Wie gesagt lerne ich das ganze gerade aus einem Buch herraus und da wird das ganze mit verschiedenen Typen durchgenommen.

Ist das also normal, dass ich das nur mit crtl+c abbrechen kann?
Weil mir stellt sich da die Frage: Wenn die Schleife nicht von selber verlassen wird,
wie kann dann ein evtl. größeres Programm, welches noch weitere Funktionen ausführen soll, diese dann aufrufen wenn es doch an der einen Stelle hängen bleibt?:suspekt:
 
Hi.

Das Programm bleibt ja nicht hängen, sondern es wartet in der Schleife bis die Eingabe geschlossen wurde, bis also keine Zeichen mehr eingelesen werden können, also EOF (end of file) erreicht ist.

Du mußt dementsprechend (wie Matthias bereits sagte) Strg+z unter Windows (evtl. plus Eingabetaste) drücken dann wird die Schleife verlassen.

Mit Strg+c brichst du das Programm ab, das ist also keine adäquate Methode die Eingabe zu beenden.

Du kannst natürlich auch auf andere Tastendrücke reagieren. Du mußt lediglich die Abbruchbedingung der Schleife anpassen.

Gruß
 
hi bradlay!
ich geb dir jetzt mal einen kleinen tipp der das ganze etwas einfacher macht:
benutze statt for while. also:
PHP:
while(getchar() != 13)

ansonsten ist an deinem Code eigentlich alles in ordnung!

gruß andro13
 
hi bradlay!
ich geb dir jetzt mal einen kleinen tipp der das ganze etwas einfacher macht:
benutze statt for while. also:
PHP:
while(getchar() != 13)

ansonsten ist an deinem Code eigentlich alles in ordnung!

gruß andro13


Die Lösung ist ganz einfach. Teste nicht auf != EOF (End of File... und du benutzt ja keine Dateien) sondern auf != ASCII von Enter => getchar() != 13

^^ vorher mal lesen was die andren geschrieben haben
 
Zurück