*Markus: (C) Prg mit Enter beenden, aber nur bei neue Zeile

Hallo,

wenn ich folgendes Testprogramm verwende, passiert es, dass das Programm dann abbricht, wenn ich genau 7 Zeichen eingebe und Enter drücke. Es sollte aber bei einer leeren Zeile abbrechen. Warum tut es das nicht?

  
#include <stdio.h>  
#include <stdlib.h>  
  
int main(void)  {  
char *string = malloc(8);  
  
       while (string[0] != '\n')   {  
    fgets(string, 8, stdin);  
    printf("%s", string);  
    }  
  
free(string);  
return 0;  
}  

Markus.

--
http://www.apostrophitis.at
STANDAR_D_  - ist das wirklich so schwer?
  1. Hallo Markus,

    wenn ich folgendes Testprogramm verwende, passiert es, dass das Programm dann abbricht, wenn ich genau 7 Zeichen eingebe und Enter drücke.

    bist du sicher, dass du richtig gezählt hast? Sind es nicht vielleicht acht Zeichen und ein Enter, die das Programmende bewirken? Das wäre nämlich logisch.

    Denn diese Anweisung

    fgets(string, 8, stdin);

    liest ja _bis zu_ 8 Zeichen von stdin, einschließlich des Return-Zeichens, das unter Unixoiden ja generell nur ein Linefeed '\n' ist.
    Wenn du also 8 druckbare Zeichen eingibst und dann Return drückst, werden im ersten Schleifendurchlauf die 8 Zeichen gelesen und verarbeitet, im nächsten Durchlauf der Rest der Eingabe - das ist das noch nicht verarbeitete Linefeed.

    So long,
     Martin

    --
    Lache, und die Welt wird mit dir lachen.
    Schnarche, und du schläfst allein.
    1. Hallo nochmal,

      bist du sicher, dass du richtig gezählt hast? Sind es nicht vielleicht acht Zeichen ...

      aah, nee, ich meine mich zu erinnern, dass fgets() _immer_ ein Nullbyte als String-Ende im Puffer mitgibt, und dass diese abschließende Null auch mitgezählt wird. Dann hast du völlig Recht mit den 7 Zeichen!

      Wenn du also 8 druckbare Zeichen eingibst ...

      Nein, sieben!

      und dann Return drückst, werden im ersten Schleifendurchlauf die 8 Zeichen gelesen und verarbeitet, ...

      7 Zeichen gelesen und ein abschließendes Nullbyte hinzugefügt.

      im nächsten Durchlauf der Rest der Eingabe - das ist das noch nicht verarbeitete Linefeed.

      Ja, hier stimmt's wieder.

      Schönen Abend noch,
       Martin

      --
      Die letzten Worte des Architekten:
      Mir fällt da gerade was ein...
      1. Hallo,

        aah, nee, ich meine mich zu erinnern, dass fgets() _immer_ ein Nullbyte als String-Ende im Puffer mitgibt, und dass diese abschließende Null auch mitgezählt wird. Dann hast du völlig Recht mit den 7 Zeichen!

        Ja, darum geht es doch. Irgendwie kann ich nicht gleichzeitig die Länge der Eingabe überprüfen, und dafür sorgen, dass er bei 7 Zeichen abbricht, aber wielöseich das Problem?

        Markus.

        --
        http://www.apostrophitis.at
        STANDAR_D_  - ist das wirklich so schwer?
        1. Hallo Markus,

          [...] Dann hast du völlig Recht mit den 7 Zeichen!
          Irgendwie kann ich nicht gleichzeitig die Länge der Eingabe überprüfen, und dafür sorgen, dass er bei 7 Zeichen abbricht, aber wielöseich das Problem?

          Es gibt vielleicht noch elegantere Methoden - aber spontan würde mir folgendes einfallen (teils in Pseudocode formuliert):

          while (1)
           { fgets(string, 8, stdin);
             if (erstes Zeichen in string ist '\n')
              { /* Programm/Funktion beenden */
              }
             /* Eingabe verarbeiten */
             while (letztes Zeichen in string ist NICHT '\n')
              { fgets(string, 8, stdin); /* Rest der Zeile lesen und vergessen */
              }
           }

          Eine andere Möglichkeit wäre sicher, den Puffer für die Eingabe _sehr_ groß zu dimensionieren, so dass eine realistisch lange Eingabezeile vollständig in einem Aufruf gelesen werden kann, und dann einfach nur die ersten 8 Zeichen davon beachten.
          Mehr fällt mir jetzt auch nicht ein, ohne deine Applikation drumherum zu kennen.

          Schönen Tag noch,
           Martin

          --
          "Drogen machen gleichgültig."
           - "Na und? Mir doch egal."
          1. Hallo,

            vielleicht wäre ein Tastenkombination, zB STRG + D, die Lösung. Allerdings findet man bei Google keine gültigen Ansi C Beispiele. Wie könnte ich einzelne Tasten am besten ansteuern?

            Markus.

            --
            http://www.apostrophitis.at
            STANDAR_D_  - ist das wirklich so schwer?