Roland: C: Wer erklärt mir diese Zeile?

Hallo Forum,

ich habe nach einer zuverlässigen Methode gesucht, den Tastaturspeicher zu löschen.
fflush(stdin); scheint nur in Windows zuverlässig zu funktionieren.
Bei stackoverflow las ich, daß "while ((c = getchar()) != EOF && c != '\n');" zuverlässig funktionieren soll, sowohl auf Windows- als auch auf Linuxsystemen.
Kann mir jemand genau erklären, was diese Zeile macht?

Roland

  1. while ((c = getchar()) != EOF && c != '\n');

    das mal aufgedröselt:

    1. c = getchar() liest einen char und speichert ihn in c

    2. (c = getchar()) != EOF wie 1. doch guckt zusätzlich noch ob c ungleich EOF ist (EOF ist eine irgendwo definierte Konstante und ist die Abkürzung für end of file, in diesem Fall -> keine Tastatureingaben)

    3. c != '\n' sollte ich nicht erklären müssen oder?

    4. (( c= getchar()) != EOF && c != '\n') ist also ein Vergleich ob getchar() etwas von EOF und '\n' verschiedenes geliefert hat.

    5. while(bedingung); macht solange nichts bis bedingung false ist.

    while ((c = getchar()) != EOF && c != '\n'); liest also solange weiter bis EOF oder '\n' zurückgegeben wird.

    Welches Betriebssystem nun EOF und welches '\n' zurückgibt weiß ich jetzt nicht.

    MfG
    bubble

    --
    If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
    1. Hi bubble,

      vielen Dank. Und warum löscht diese Zeile den Tastaturspeicher dann?

      Roland

      1. vielen Dank. Und warum löscht diese Zeile den Tastaturspeicher dann?

        getch() holt sich immer das nächste Zeichen aus jenem Speicher und entfernt ihn von dort.

        MfG
        bubble

        --
        If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
        1. vielen Dank. Und warum löscht diese Zeile den Tastaturspeicher dann?
          getch() holt sich immer das nächste Zeichen aus jenem Speicher und entfernt ihn von dort.

          Anders ausgedrückt: Das ist eine Dauerschleife, die erst beendet wird, wenn der Benutzer nicht mehr schneller auf die Tastatur kloppt als getch() die Zeichen aus dem Tastaturspeicher :>

          1. vielen Dank. Und warum löscht diese Zeile den Tastaturspeicher dann?
            getch() holt sich immer das nächste Zeichen aus jenem Speicher und entfernt ihn von dort.

            Anders ausgedrückt: Das ist eine Dauerschleife, die erst beendet wird, wenn der Benutzer nicht mehr schneller auf die Tastatur kloppt als getch() die Zeichen aus dem Tastaturspeicher :>

            Anders ausgedrückt, das ganze ist absoluter Murks und dazu verdammt, einem irgendwann am besten zufällig um die Ohren zu fliegen. ;)
            Aber wenn man C benutzt, hat man wahrscheinlich wenig andere Optionen...

            1. Anders ausgedrückt, das ganze ist absoluter Murks und dazu verdammt, einem irgendwann am besten zufällig um die Ohren zu fliegen. ;)

              Glaub ich nicht.

              Aber wenn man C benutzt, hat man wahrscheinlich wenig andere Optionen...

              Wenn es überhaupt eine gibt, sag sie doch einfach...

              Roland

              1. Anders ausgedrückt, das ganze ist absoluter Murks und dazu verdammt, einem irgendwann am besten zufällig um die Ohren zu fliegen. ;)

                Glaub ich nicht.

                Mit Glauben hat das nichts zu tun. =)

                Aber wenn man C benutzt, hat man wahrscheinlich wenig andere Optionen...

                Wenn es überhaupt eine gibt, sag sie doch einfach...

                Kommt drauf an. Haskell wäre möglicherweise Eine. ;)

      1. c != '\n' sollte ich nicht erklären müssen oder?

      Stellt das in C das Zeilenende dar?

      PHP jedenfalls unterscheidet zwischen "\n" (wird interpretiert) und '\n' (meint die beiden Zeichen).

      Wie würde man in C mit den beiden Zeichen '\n' vergleichen?

      Linuchs

        1. c != '\n' sollte ich nicht erklären müssen oder?

        Stellt das in C das Zeilenende dar?

        Naja '\n' stellt halt das line-feed-Zeichen dar, man könnte genauso gut c != 10 schreiben.

        PHP jedenfalls unterscheidet zwischen "\n" (wird interpretiert) und '\n' (meint die beiden Zeichen).

        In C unterscheidet man anders, da kann man mit ' nur einzelne Zeichen darstellen, sprich bei 'ab' würde der Compiler schreien.

        Wie würde man in C mit den beiden Zeichen '\n' vergleichen?

          
        char[] slash_n = "\\n";  
        char* to_test = get_random_string();  
        if (strcmpr(to_test, slash_n) == 0) {  
            //bla  
        }
        

        MfG
        bubble

        --
        If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
        1. char* slash_n = "\\n";

          MfG
          bubble

          --
          If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
      1. Hallo,

        1. c != '\n' sollte ich nicht erklären müssen oder?
          Stellt das in C das Zeilenende dar?

        richtig, ganz genau das Steuerzeichen Linefeed.

        PHP jedenfalls unterscheidet zwischen "\n" (wird interpretiert) und '\n' (meint die beiden Zeichen).

        Korrekt.
        Und auch in C ist es ein Unterschied, ob man '\n' oder "\n" notiert:

        Einfache Anführungszeichen benutzt man, wenn man konkret ein einzelnes Zeichen angeben möchte. Das ist dann vom Typ char, der seinerseits zu int kompatibel ist. Daher sind folgende Anweisungen vollkommen gleichwertig (vorausgesetzt, c ist als char- oder int-Typ deklariert):

        c = '\n';  
        c = 10;  
        c = '\t'+1;
        

        Das letzte Beispiel ist in der Praxis vermutlich sinnfrei, hier nur als Kuriosum: \t stellt ein Tab-Zeichen dar, also numerisch 9. Eins dazugezählt ergibt 10. ;-)

        Verwendet man dagegen doppelte Anführungszeichen, meint man einen String, der beliebig lang sein kann und implizit noch mit einem Nullbyte abgeschlossen wird. Der Ausdruck ist dann vom Typ char* (Zeiger auf char).
        Die Anweisung

        c = "\n";

        setzt also voraus, dass c als char* deklariert ist (sonst gibt's schon beim Übersetzen einen Fehler), und lässt c dann auf einen Speicherbereich zeigen, in dem hintereinander die Byte-Werte 10 und 0 stehen.

        Wie würde man in C mit den beiden Zeichen '\n' vergleichen?

        Indem man, wie bubble schon gezeigt hat, dem Backslash seine Sonderbedeutung nimmt und ihn selbst wieder "escapet". Allerdings ist ein Stringvergleich in reinem C (nicht C++) schon tricky, denn die Abfrage

        if (string1==string2) ...

        liefert nicht das Ergebnis, das manche erwarten. Sie vergleicht nicht die beiden Strings, sondern die beiden Zeiger - also die Speicheradressen, an denen die beiden Strings abgelegt sind, nicht deren Inhalt. Darum liefert diese Abfrage auch nur dann true, wenn beide Zeiger identisch sind. Um Strings richtig zu vergleichen, muss man in C auf die Standardfunktion strcmp() oder eine ihrer Varianten zurückgreifen.

        So long,
         Martin

        --
        Wer barfuß geht, dem kann man nicht die Schuld in die Schuhe schieben.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(