perror - file fgets c




Warum ist die Fgets-Funktion veraltet? (2)

Das ist nur GNU-Propaganda. In keinem offiziellen Sinne ist fgets veraltet. gets jedoch ist gefährlich und veraltet.

Aus dem GNU C Programmierkurs :

Die Funktion fgets ("file get string") ähnelt der Funktion "gets". Diese Funktion ist veraltet - das bedeutet, dass sie veraltet ist und dringend empfohlen wird, sie nicht zu verwenden - weil sie gefährlich ist. Es ist gefährlich, wenn die Eingabedaten ein Nullzeichen enthalten, können Sie nicht sagen. Verwenden Sie keine fgets sei denn, Sie wissen, dass die Daten keine Null enthalten können. Verwenden Sie es nicht zum Lesen von Dateien, die vom Benutzer bearbeitet wurden. Wenn der Benutzer ein Nullzeichen einfügt, sollten Sie entweder ordnungsgemäß damit umgehen oder eine klare Fehlermeldung ausgeben. Verwenden getline immer getline oder getdelim anstelle von fgets wenn Sie können.

Ich dachte, dass die fgets Funktion stoppt, wenn es \0 oder \n trifft; Warum schlägt diese Handbuchseite vor, dass ein Nullbyte "gefährlich" ist, wenn fgets die Eingabe richtig handhaben sollte? Was ist der Unterschied zwischen getline und fgets , und ist die fgets Funktion in den C99- oder zukünftigen C-Standards wirklich veraltet ?


Nein, fgets ist in C99 oder dem aktuellen Standard C11 nicht wirklich veraltet. Aber der Autor dieses Tutorials hat Recht, dass fgets nicht aufhört, wenn es auf ein NUL stößt, und hat keinen Mechanismus, um das Lesen eines solchen Zeichens zu melden.

Die fgets Funktion liest maximal 1 weniger als die Anzahl der Zeichen, die von n aus dem Stream, auf den stream in das Array zeigt, auf das s . Nach einem Zeichen für eine neue Zeile (das beibehalten wird) oder nach dem Ende der Datei werden keine zusätzlichen Zeichen gelesen.

(§7.21.7.2)

GNUs getdelim und getline wurden in POSIX 2008 standardisiert. Wenn Sie also auf eine POSIX-Plattform abzielen, ist es vielleicht keine schlechte Idee, diese stattdessen zu verwenden.

EDIT Ich dachte, es gab absolut keinen sicheren Weg, um fgets im Angesicht von NUL-Charakteren zu benutzen, aber R .. (siehe Kommentare) wies darauf hin, dass es gibt:

char buf[256];

memset(buf, '\n', sizeof(buf));  // fgets will never write a newline
fgets(buf, sizeof(buf), fp);

buf nun nach dem letzten nicht \n Zeichen in buf . Ich würde diesen Klud, aber nicht wirklich empfehlen.





buffer-overflow