fgets()
ist in der stdio
definiert, die in C über stdio.h
, bzw in C++ über cstdio
eingebunden wird.
fgets()
liest einen String (eine Zeile) durch Benutzereingaben (stdio) bzw. ein Dateihandle (FILE) ein. Der Lesevorgang endet, wenn ein Newline-Zeichen oder das EOF
-Zeichen gelesen wird. Jeder gelesene String wird mit einem Nullbyte ('\0') abgeschlossen.
#include <stdio.h> char * fgets( char * str, int size, FILE * stream );
str: Ein char
-Array, welches der String geschrieben werden soll.
size: Größe des Strings-Buffers. fgets()
liest damit maximal size
-1 Zeichen und fügt ein Nullbyte an.
stream: Stream, aus dem der String gelesen werden soll
Return Value: NULL im Fehlerfall (z.B. Dateiende), ansonsten der übergebene Parameter str
-
Als Gegenbeispiel für die gefährliche gets()
-Funktion hier eine sicherere Variante:
#include <stdio.h> #include <stdlib.h> int main() { char third[16] = "Third"; char str[16]; char second[16] = "Second"; printf("Enter String: "); fgets(str, 16, stdin); printf( "Eingabe: %x - %.16s\n", (unsigned int)str, str ); printf( "Second : %x - %.16s\n", (unsigned int)second, second ); printf( "Third : %x - %.16s\n", (unsigned int)third, third ); return EXIT_SUCCESS; }
Das binäre Nullzeichen '\0' wird automatisch angefügt. Das eingegebene Newline-Zeichen (Return-Taste) wird ebenfalls übernommen:
Enter String: First Eingabe: bf4cd7d0 - First Second : bf4cd7c0 - Second Third : bf4cd7e0 - Third
Provokation eines Bufferoverflows:
Enter String: 0123456789012345First Enter String: 0123456789012345First Eingabe: d0e42980 - 012345678901234 Second : d0e42970 - Second Third : d0e42990 - Third
Hier sehen wir, dass im Gegensatz zur gleichen Eingabe wie bei gets()
der Eingabestring nach 15 Zeichen endet, obwohl 16 gedruckt werden dürfen. Als 16. Zeichen findet sich das Nullbyte, dass den String hier gültig begrenzt. Die dahinter liegende Variable third
wird nicht verändert. Die weiterhin eingegebene Zeichenkette „5First“ und auch das Return-Zeichen liegt noch im Eingabestream. Durch die Tatsache, dass am Ende kein Newline-Zeichen auftritt, wissen wir, dass wir diese Zeile noch nicht zu Ende gelesen haben.