while | scanf | fflush(stdin)



  • Hallo,

    Ich hab gerade ein Beispiel aus meinem Buch gelöst.
    Die Aufgabenstellung lautet: Man gibt einen Buchstaben ein, und es soll derselbe ausgegeben werden, nur groß oder klein.

    Hier meine Lösung:

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        char buchstabe;
    
        while(1)
            {
            printf("Buchstabe: ");
            scanf("%c", &buchstabe);
            fflush(stdin);
    
            if(buchstabe == '.')
                    break;
    
            if(buchstabe > 'Z')
                   {
                   buchstabe = buchstabe - ('a' - 'A');
                   printf("Buchstabe: %c\n\n", buchstabe);
                   }
            else
                   {
                   buchstabe = buchstabe + ('a' - 'A');
                   printf("Buchstabe: %c\n\n", buchstabe);
                   }
            }
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Als erstes hatte ich fflush(stdin) noch gar nicht drinnen, erst nachdem ich einen doppelte Ausgabe erhalten habe und so in den Lösungen nachgeschaut hab. 🙄

    Leider wurde im Buch fflush(stdin) noch nicht erklärt.
    Wieso gibt es in einer while-Schleife eine doppelte Ausgabe?

    Ich hab hier ein wenig rumgesurft und gelesen dass die Tastaturchache zu löschen ist??? Und wieso schreiben viele, dass man fflush(stdin) auf keinen Fall verwenden sollte?

    Hoffe es kennt jemand den genauen Vorgang mit der Tastaturchache usw.
    Würd mich interessieren.

    Gruß



  • Naja das liegt daran, dass wenn du scanf verwendest um etwas einzulesen, das newline-Zeichen '\n' (wenn du ENTER drückst, zählt das nämlich genau so als Zeichen zur Eingabe dazu) hängen bleibt!

    Ich umgeh das Problem immer so anstatt da rum zu flushen:

    while(getchar() != '\n');
    


  • Noch ein kleiner Hinweis:

    Da Du ja bei der Eingabe alle Zeichen außer a-z und A-Z ausschließen musst, kannst Du die Eingabe darauf prüfen, ob das eingegebene Zeichen ein Buchstabe ist und nur dann Deine "Umwandlung" vornehmen. Dafür gibt es isalpha(), also:

    if( isalpha(buchstabe) )
    {
    
       // Buchstabe "umwandeln" und wieder ausgeben
    
    }
    

Anmelden zum Antworten