fgets()

fgets() ist in der 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 <stdio.h>
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 <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, 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