Warum ist der fgets-Funktion veraltet?
Vom Der GNU-C-Programmierung Tutorial:
Den
fgets
("file get string") - Funktion ist ähnlich wie die bekommt
Funktion. Diese Funktion ist veraltet -- das bedeutet, dass es veraltet ist
und es ist dringend empfohlen, Sie verwenden Sie es nicht, -- denn es ist
gefährlich. Es ist gefährlich, weil, wenn die Eingabedaten eine null
Charakter, kann man nicht sagen. Verwenden Sie nichtfgets
es sei denn, Sie wissen, die Daten
nicht enthalten den Wert null. Verwenden Sie es nicht zum Lesen von Dateien, die vom Benutzer bearbeitet
weil, wenn der Benutzer fügt ein null-Zeichen, sollten Sie entweder
behandeln Sie es richtig, oder drucken Sie eine klare Fehlermeldung. Verwenden Sie immer
getline
odergetdelim
stattfgets
wenn Sie können.
Ich dachte, die fgets
Funktion Stoppt, wenn es auf eine \0
oder \n
; warum dieses Handbuch Seite schlagen Sie ein null-byte ist "gefährlich", wenn fgets
sollten die Eingaben verarbeiten, richtig? Außerdem, was ist der Unterschied zwischen getline
und fgets
, und ist die fgets
Funktion wirklich als veraltet in der C99 oder zukünftigen C-Normen?
InformationsquelleAutor Vilhelm Gray | 2013-05-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein,
fgets
ist nicht wirklich veraltet in C99 oder die aktuelle standard C11. Aber der Autor des Tutorials ist richtig, dassfgets
wird nicht aufhören, wenn es auf NULL, und hat keinen Mechanismus für die Berichterstattung das Lesen von so einem Charakter.(§7.21.7.2)
GNU ' s
getdelim
undgetline
wurden standardisiert in POSIX 2008, so dass, wenn Sie eine Ausrichtung auf eine POSIX-Plattform, dann ist es vielleicht nicht eine schlechte Idee, verwenden Sie diese statt.BEARBEITEN ich dachte, es war absolut kein sicherer Weg, um
fgets
im Gesicht von NUL-Zeichen, aber R.. (siehe Kommentare) darauf hingewiesen, es gibt:Suchen jetzt die letzten nicht-
\n
Charakter inbuf
. Ich würde nicht wirklich empfehlen, diese Unordnung, aber.fgets
oder nicht.null-bytes gehören nicht in den text - Dateien.
fgets()
wurde speziell für die Arbeit mit text-Dateien: die Verwendungfgets()
Dateien mit binären Daten wird nicht empfohlen.neigt dazu, das Vertrauen der Benutzer zu viel -- es kann einfach nicht voraussehen, lange Zeilen, die null-Zeichen in text-Dateien, etc. Es ist aus den 1970er Jahren, als die defensive Programmierung war nicht als so wichtig, wie es jetzt ist (kein internet, keine script-kiddies versuchen, in Ihr system einzubrechen, keine noob-Nutzer, dass spam -, wenn Sie vermasseln eine text-Datei).
wahrscheinlich, aber wenn I/O ist nicht der Engpass, ich ziehe meinen code rein.
// fgets will never write a newline
Kommentar ist unklar. Sicherlich ein'\n'
in den buffer geschrieben, die auf vielenfgets()
Anrufe. Meinst du// fgets will never read after a newline
?InformationsquelleAutor Fred Foo
Dies ist nur GNU-propaganda. In keinem offiziellen Sinne ist
fgets
veraltet.gets
ist jedoch gefährlich und veraltet.gets
tatsächlich war entfernt aus dem Jahr 2011 ISO-C-standard. (Es wurde nicht offiziell veraltet oder veralteten in C99.)Abschnitt 7.26.9 von ISO/IEC 9899:1999 TC3 sagt "Die
gets
Funktion ist veraltete, ist veraltet." also ich glaube, dassgets
war offiziell nicht mehr in C99.War, dass Sprache Hinzugefügt in einem von den TC ' s, oder war es in der original-Publikation von C99?
Es wurde Hinzugefügt von TC3.
InformationsquelleAutor R..