======fgets()====== ''fgets()'' ist in der ''[[c:lib:stdio:start|stdio]]'' definiert, die in C über ''stdio.h'', bzw in C++ über ''cstdio'' eingebunden wird. ===== Funktion ===== ''fgets()'' liest einen String (eine Zeile) durch Benutzereingaben (''stdin'') 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. ===== Signatur ===== #include char * fgets( char * str, int size, FILE * stream ); **str**: Ein ''char''-Array, in welches der String geschrieben werden soll.\\ **size**: Größe des String-Buffers ''str''. ''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'' ===== Fehlerquellen ===== Das übergebene Array ''str'' muss groß genug sein, um ''size''-1 Zeichen sowie ein abschließendes Nullbyte aufnehmen zu können. ===== Beispiel ===== Als Gegenbeispiel für die gefährliche ''[[gets()]]''-Funktion, hier eine sicherere Variante: #include #include 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, das 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. ===== siehe auch ===== [[c:lib:stdio:start|stdio]]: [[c:lib:stdio:fscanf]]