fgets Frage



  • Hallo es geht um die Funktion fgets. Ich habe nun nach einigen etwas komischen Forumlierungen endlich herausgefunden daß fgets das abschließende \n in der Zeichenkette mit ablegt wenn man über die Standardeingabe einliest.

    Dann habe ich diesen Code gefunden

    Prototype: char *fgets(char *s, int n, FILE *stream);
    
    Syntax:    char  Data[80];
    	   char *ReturnCode;
    	   FILE *FilePointer;
    
    	   ReturnCode=fgets(Data, 80, FilePointer);
    

    Also meiner Ansicht nach und ich hab dieses Problem auch bein einem meiner Programme jetzt festgestellt geschieht folgendes. Wenn ich 79 Zeichen einlese(stdin)und dann bestätige ist das 80 te Zeichen ein \n. Somit ist aber dann kein Platz mehr für die terminierende null. Gibt es eine Möglichkeit fgets daran zu hindern das \n miteinzulesen oder muss man quasi dann vorsichtshalber immer Feldlänge-1 schreiben, da fgets ja Feldlänge-1 Zeichen einließt und das letzte für die terminierende \0 lässt wobei ich ja immer damit rechnen muss, daß obiger Fall eintritt. Was macht man denn da am Besten um das \n wieder loszuwerden?

    Grüße



  • Lazarus schrieb:

    Gibt es eine Möglichkeit fgets daran zu hindern das \n miteinzulesen oder muss man quasi dann vorsichtshalber immer Feldlänge-1 schreiben, da fgets ja Feldlänge-1 Zeichen einließt und das letzte für die terminierende \0 lässt wobei ich ja immer damit rechnen muss, daß obiger Fall eintritt. Was macht man denn da am Besten um das \n wieder loszuwerden?

    Vielleicht überprüfst Du mal die Fakten statt zu spekulieren. fgets ließt immer so ein, daß das letzte im String plazierte Zeichen ein \0 ist. Wenn vor dem \0 noch ein \n stand, dann weißt Du, daß die Zeile vollständig eingelesen wurde, sonst ist sie länger (Manchmal eine Ausnahme: die letzte Zeile). Und nein: fgets kann man dieses Verhalten nicht abgewöhnen, das ist so dokumentiert und sollte auch in der Hilfe zu deinem Entwicklungssystem stehen. Du hast aber recht, daß dieses Interface etwas unangenehm zum Arbeiten ist. Vielleicht ist es ganz nett, wenn man sich für den Anfang eine Funktion chomp bastelt, die das überzählige \n raushaut (so wie man's in Perl macht) oder gleich ein eigenes fgetline.



  • Na ich glaub meine IDE hat einen Knall. Jetzt ist es so wie du gesagt hast. Dieses Verhalten was ich oben beschrieben habe taucht immer wieder auf. Ich glaub ich schmeiß das Ding mal runter und installier neu.



  • Lazarus schrieb:

    Hallo es geht um die Funktion fgets. Ich habe nun nach einigen etwas komischen Forumlierungen endlich herausgefunden daß fgets das abschließende \n in der Zeichenkette mit ablegt wenn man über die Standardeingabe einliest.

    Das ist richtig so. Wieso sollte es denn anders sein? Dass \n mitgelesen wird, hat den Vorteil, dass wenn die Zeile länger ist (in deinem Bsp) 80 Zeichen lang, dann kann man merken, ob man die gesamte Zeile gelesen hat.

    char *fgets(char *s, int n, FILE *stream);
    

    fgets liest die erste n-1 Zeichen, wenn aber in den ersten n-1 Zeiche ein \n vorkommt, dann ist die Zeile am Ende und deswegen bricht fgets ab.

    Deinem Beispiel nach, sollte fgets das \n lesen, aber das \n ist das 80. Zeichen, also nicht mehr im Bereich (fgets liest die erste 79 Zeichen). Wieso soll dann fegts das \n nicht lesen?

    Und noch was: die IDE hat mit fegts nichts zu tun.


Anmelden zum Antworten