root@ubuntu:~/DH$ cat E1-6.c 
#include<stdio.h>
main()
{
    int c;
    while(c = (getchar() != EOF)) {
        printf("HI: %d",c);
        //putchar(c);
    }
}
root@ubuntu:~/DH$ cc E1-6.c
root@ubuntu:~/DH$ ./a.out 
1
HI: 1HI: 1

Ich habe die Eingabe über die Tastatur als 1 angegeben, aber in der Ausgabe wird sie zweimal angezeigt. Kann mir bitte jemand erklären, was hier passiert?

c
3
david becker 28 Dez. 2015 im 19:56

3 Antworten

Beste Antwort

Der Fehler tritt auf, weil, wie in den Kommentaren angegeben, die "1" eine Taste ist und die "Eingabetaste" nach der 1 (oder Strg - D für {{X0}) gedrückt wird }) ist ein weiterer Schlüssel. Der Grund, warum beide "1" ausdrucken, liegt daran, dass Sie c als booleschen Wert (wahr / falsch) von getchar() != EOF festlegen. Was ich denke du willst ist

while ((c = getchar()) != EOF)

Oben, wenn Ihre Schleife. Dadurch wird die gedrückte Taste in c gespeichert und anschließend nach EOF gesucht.

6
Paul Roub 28 Dez. 2015 im 17:14

Ihre while -Anweisung funktioniert nicht richtig. Versuchen Sie, Ihr Programm mit der Eingabe "2" auszuführen. Ich denke, Sie werden ein interessantes Ergebnis erzielen.

Ihre Eingabe ist das Zeichen 1, gefolgt von einer neuen Zeile \n und dann EOF. Der erste Aufruf von getchar gibt 1 zurück, 1 ist nicht EOF, also c = 1. Der zweite Aufruf gibt \n zurück, \n ist nicht EOF, also wieder c = ('\n' != EOF), was c = 1 bedeutet.

Versuchen Sie stattdessen:

while((c = getchar()) != EOF) {
2
Dan 28 Dez. 2015 im 17:01

Meiner Ansicht nach

while(c = (getchar() != EOF)) {

Sollte sein

while((c = getchar()) != EOF) {

As c sollte nicht dem Vergleich, sondern dem Rückgabewert von getchar zugeordnet werden.

0
Ed Heal 28 Dez. 2015 im 17:01