scanf()

scanf() ist in der stdio definiert, die in C über stdio.h, bzw in C++ über cstdio eingebunden wird.

Funktion

scanf() wird dazu verwendet, um einen String aus einem Standardeingabestream zu interpretieren und in Variablen abzulegen, wie es über einen Platzhalter für String-Funktionen beschrieben ist.

Signatur

#include <stdio.h>
int scanf( char const * formatString, ... );

formatString: Platzhalter für String-Funktionen, der beschreibt, wie der zu parsende String zusammengesetzt ist
: Eine Anzahl von Argumenten, entsprechend des Formatstrings

Return Value: Die Länge der geparsten Zeichen aus dem Eingabestring.

Fehlerquellen

Der Eingabestring muss dem Formatstring entsprechen. scanf() liest von der Standardeingabe, was gerade bei Anfängerprogrammen in der Regel die Tastatur ist. Gibt der Benutzer die Daten nicht genau in dem Format ein, wie es dem Formatstring entspricht, führt dies zu willkürlichen Ergebnissen. Da der Entwickler den Benutzer nicht kontrollieren kann, kann man nicht davon ausgehen, dass die Eingaben einen Sinn ergeben. Entsprechend gefährlich ist die Verwendung von scanf().
Im nachfolgenden Beispiel wird ein String eingelesen, ist dieser String länger als der Zwischenspeicher, so kann das Programm abstürzen. Weiterhin darf der String keine Leerzeichen enthalten, da diese als Trennsymbole zwischen mehreren Strings darstellt. Für Eingaben sollte entweder eine GUI oder Parameter verwendet werden.

Bei Einsteigern ist es besonders beliebt, Parameter wie in printf() zu übergeben. Es werden jedoch die Adressen der Variablen benötigt. Die Variablen müssen also mit dem vorangestellten AddressOf-Operator (&variable) übergeben werden, sofern es keine Zeigervariablen sind, die bereits auf den zu beschreibenden Speicherplatz zeigen.

Bei Eingaben von der Tastatur entstehen häufig Probleme dadurch, dass scanf() wie printf() mit abschließendem Newline verwendet wird.

char text[]="Hello World\n";
printf( "%s\n", text );
scanf( "%s\n", text );

Hier ist darauf zu achten, dass das Newline (\n) zu unerwartetem Verhalten führen kann.

Beispiel

#include <stdlib.h>
#include <stdio.h>
 
int main()
{
  int i = 0;
  char string[16];
 
  printf( "Bitte geben Sie einen String ein: " );
  fflush( stdout );
  scanf( "%s", &string[0] );   // Adresse des ersten Buchstabens
  printf( "Sie gaben folgenden String ein: %s\n", string );
 
  printf( "Bitte geben Sie einen Integer ein: ");
  fflush( stdout );
  scanf( "%i", &i );          // Adresse von i
  printf( "Sie gaben folgenden Integer ein: %d\n", i );
 
  return EXIT_SUCCESS;
}

Ausgabe:

Bitte geben Sie einen String ein: proggen.org
Sie gaben folgenden String ein: proggen.org
Bitte geben Sie einen Integer ein: 42
Sie gaben folgenden Integer ein: 42

siehe auch