while doppelte ausgabe



  • hey,

    nach dem ich jetzt den ganzen Vormittag damit verbracht habe eine Lösung zu meinem Problem zu finden, hab ich mich jetzt letztendlich doch entschieden Hilfe herbeizuholen.

    Ich hab folgendes Problem:
    In folgendem Programm soll ledeglich überprüft werden ob der eingegebene Buchstabe auch ein gültiger Buchstabe ist. Ich weiß das es da glaube Funktionen gibt die mir die Arbeit abnehmen, aber ich würde gern selbst darauf kommen.

    Programmcode:

    1 #include<stdio.h>
      2
      3 char iZbu( char c) {
      4     if(( c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') )
      5         return c;
      6     else·
      7         return EOF;
      8 }
      9
     10 int main (void) {
     11     int c;
     12
     13     printf("Put a character: ");
     14     //scanf("%c",&c);
     15
     16     while((c=getchar()) != iZbu(c)) {
     17         printf("Put a new character: ");
     18     }
     19
     20     printf("The Character %c is valid!\n",c);
     21
     22     return 0;
     23 }
    

    Aber in der Ausgabe wird mir der printf aus der while bei fehlerhafter Eingabe immer gleich 2 mal ausgegeben:

    alex@server ~ $ ./a.out
    Put a character: 5
    Put a new character: Put a new character:
    

    Ich hab echt keinen Plan warum das so ist?! Vielt. kann mir da jemand auf die Sprünge helfen. Vielt ist es auch einfach ein dummer Denkfehler, aber da ich jetzt solange da dran rum gedocktert habe und schon etliche male neu angefangen habe, kanne sein das ich einfach auf dem Schlauch stehe! 😕

    so weit...



  • Das liegt daran das du 2 Tasten gedrückt hast, das Zeichen und ENTER. Du musst vor erneutem einlesen eines Zeichens den Tastatureingabepuffer löschen.
    Das kannst du zum Beispiel machen indem du gleich nochmal getchar aufrufst.

    printf("Put a new character: ");
    getchar();
    

    Richttiger wäre sicher so etwas wie

    fflush(stdin);
    


  • das erste funktioniert, das 2. hatte ich auch grad gefunden aber das klappt leider nicht.

    Aber danke für die rasche Antwort!



  • oneill5000 schrieb:

    Richttiger wäre sicher so etwas wie

    fflush(stdin);
    

    Schwachsinn ... fflush ist auf stdin nicht definiert. Siehe in den FAQ, wie man den Eingabepuffer richtig löscht.



  • 'Reg dich ab und beachte die Silbe "wäre vielleicht"! Die Lösung wurde davor genannt! Auch wenn du sicher Rechts hast, aber ganzs icher ist es nicht toaler Schwachsinn, sonst würde es nicht überall kusieren.



  • oneill5000 schrieb:

    'Reg dich ab und beachte die Silbe "wäre vielleicht"! Die Lösung wurde davor genannt! Auch wenn du sicher Rechts hast, aber ganzs icher ist es nicht toaler Schwachsinn, sonst würde es nicht überall kusieren.

    fflush(stdin); ist eine Krankheit, die man ausroten soll. Ein Schwachsinn, was immer wieder wiederholt wird, bleibt Schwachsinn.

    @alex: iZbu kannst du man: isalpha(3) erseten.



  • Man beachte wie dieser "Schwachsinn" sogar offiziell in der MSDN Library in den Beispielen aufgezeigt ist
    http://msdn.microsoft.com/de-de/library/9yky46tz.aspx



  • oneill5000 schrieb:

    Man beachte wie dieser "Schwachsinn" sogar offiziell in der MSDN Library in den Beispielen aufgezeigt ist
    http://msdn.microsoft.com/de-de/library/9yky46tz.aspx

    Ja, beim MS-Compiler geht das auch in Ordnung. Es ist nur nicht standardkonform und deshalb so verpönt. Und auch wenn ich das nicht so extrem wie andere sehe: warum nimmst du nicht einfach eine Version, die mit allen Compilern funktioniert? Es schadet ja nicht....



  • @_matze

    Genau, da hast du vollkommen Recht. Man sollte es wenn es geht nicht verwenden. Deswegen auch nur meine Aussage

    oneill5000 schrieb:

    Auch wenn du sicher Rechts hast, aber ganzs icher ist es nicht toaler Schwachsinn,



  • oneill5000 schrieb:

    Man beachte wie dieser "Schwachsinn" sogar offiziell in der MSDN Library in den Beispielen aufgezeigt ist
    http://msdn.microsoft.com/de-de/library/9yky46tz.aspx

    [bashing]
    und was erwartest du denn von Winzigweich?
    [/bashing]

    fflush(stdin); ist und bleibt eine Fehler (vor allem, wenn man in ANSI C Forum postet).



  • supertux schrieb:

    fflush(stdin); ist und bleibt eine Fehler (vor allem, wenn man in ANSI C Forum postet).

    Als Compiler-spezifische Implementierung, die das zulässt und auch so dokumentiert ist, ist das kein Fehler.

    So, jetzt können wir anfangen, uns im Kreis zu drehen! 😉



  • _matze schrieb:

    Als Compiler-spezifische Implementierung, die das zulässt und auch so dokumentiert ist, ist das kein Fehler.

    ok, da hast du Recht. Dennoch finde ich nicht in Ordung, im ANSI C Forum es als Lösung vorzustellen.



  • supertux schrieb:

    _matze schrieb:

    Als Compiler-spezifische Implementierung, die das zulässt und auch so dokumentiert ist, ist das kein Fehler.

    ok, da hast du Recht. Dennoch finde ich nicht in Ordung, im ANSI C Forum es als Lösung vorzustellen.

    Da widerspreche ich dir nicht. Wie gesagt, es spricht ja nichts gegen die standardkonforme Lösung.



  • Mein Reden 🤡


Anmelden zum Antworten