[C/C++] Printf: Doppelt?

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Heisenberg, 12. Januar 2013 .

Schlagworte:
  1. 12. Januar 2013
    Printf: Doppelt?

    Nabend,

    wenn ich folgende Code in C ausführe:

    Code:
    #include <stdio.h>
    
    int main(void){
    char wahl;
    
    printf("Hallo!\n");
    while (wahl != 'b'){
     printf("Drücken Sie b, wenn sie keine weitere Routenberechnungen vornehmen wollen\n");
     scanf("%c", &wahl);
     }
     
     return 0;
    }
    
    Wird "Drücken Sie ..." immer 2x ausgegeben. Warum das?
     
  2. 12. Januar 2013
    Zuletzt bearbeitet: 12. Januar 2013
    AW: Printf: Doppelt?

    scanf ließt/verarbeitet Zeichen so Lange bis der Eingabepuffer leer ist. Beispiel:

    Code:
    Drücken Sie b, wenn sie keine weitere Routenberechnungen vornehmen wollen
    qeqwe
    Drücken Sie b, wenn sie keine weitere Routenberechnungen vornehmen wollen
    Drücken Sie b, wenn sie keine weitere Routenberechnungen vornehmen wollen
    Drücken Sie b, wenn sie keine weitere Routenberechnungen vornehmen wollen
    Drücken Sie b, wenn sie keine weitere Routenberechnungen vornehmen wollen
    Drücken Sie b, wenn sie keine weitere Routenberechnungen vornehmen wollen
    Drücken Sie b, wenn sie keine weitere Routenberechnungen vornehmen wollen
    
    Selbes gilt auch für das Newline-Zeichen (\n). Daher kommt bei deinem obigen code die Ausgabe zweimal. Einmal für den gelesenen Buchstaben, und einmal für "\n" (Es muss ja nicht auf eine Eingabe warten, sondern hat \n bereits im Puffer).

    Dazu gibt es viele Lösungen, und meine ist nur eine der vielen Möglichkeiten:

    Code:
    
    #include <stdio.h>
    
    int main(void){
     char wahl;
    
     printf("Hallo!\n");
     while (wahl != 'b'){
     printf("Drücken Sie b, wenn sie keine weitere Routenberechnungen vornehmen wollen\n");
     scanf("\n%c", &wahl);
     }
    
     return 0;
    }
    
    Dort wird scanf gesagt, dass es "\n+char" lesen soll, und diesen char dann in &wahl speichern. Und voila, es funktioniert
     
  3. 12. Januar 2013
    AW: Printf: Doppelt?

    Gibst Du lediglich "a" ein und bestätigst deine Eingabe mit Enter, werden 2 Zeichen in den Puffer geschrieben: 'a' und '\n'. Da du nur ein Zeichen einliest (1. "a") und den Puffer nicht leerst bleibt noch das '\n'-Zeichen (Newline) übrig, welches beim nächsten Durchlauf gelesen wird.

    Lösung (Gut):
    Code:
    char c;
    ...
    scanf(...);
    while ((c = getchar()) != EOF && c != '\n');
    Lösung (Nicht so gut):
    Code:
    scanf(...);
    fflush(stdin);
    Wie fflush() auf Eingabestreams reagiert ist nicht definiert. Es kann sein, dass es funktioniert, es kann aber auch sein, dass es das nicht tut.

    // Edit: Oder man macht es ganz einfach mit einer ordentlichen Formatierung in scanf() (s.o.)
     
  4. 12. Januar 2013
    AW: Printf: Doppelt?

    Hatte ich hier auch nochmal versucht, hat aber in meinem Terminal nicht funktioniert. (glibc 2.15)
     
  5. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.