Beitragsseiten

Formatierte Eingabe mit scanf()

Um eine Eingabe von der Tastatur bereitzustellen, kann man die scanf()-Funktion benutzen. Der scanf() steht in der Standardbibliothek stdio.h.

 
Als erstes die Syntax der Funktion:

int scanf(const char *format, ...);


Mit Hilfe der Funktion scanf() können unterschiedliche Werte (unterschiedlichen Datentypen) formatiert eingelesen werden. Dabei wird von dem Standardeingabe (stdin), normalerweise die Tastatur, eingelesen.
Darüber hinaus liefert der scanf() die Zahl eingelesenen Zeichen als Rückgabewert zurück. Bei fehlerfreier Ausführung liefert die scanf()-Funktion die Anzahl der Zeichen zurück, die erfolgreich gelesen, konvertiert und gespeichert wurden. Wenn die Eingabe von scanf() fehlerhaft ist, gibt scanf() eine 0 zurück.

Beispiel:

#include <stdio.h>

void main ()
{
  int zahl;
  
  printf("Bitte geben Sie eine Zahl ein : "); // Ausgabe der Eingabeaufforderung
  scanf("%d",&zahl);                          // Eingabe durch den Benutzer
  printf("Die Zahl lautet %d.\n", zahl);      // Ausgabe der Benutzereingabe
}


Bildschirmausgabe für die Eingabe 100:

Bitte geben Sie eine Zahl ein : 100
Die Zahl lautet 100.


Der Aufbau von scanf() hat sehr viel Ähnlichkeit mit printf(). Scanf() ließt die Eingabe formatiert ein. Darum hat die Funktion in den runden Klammern einen Bereich, der durch zwei Anführungszeichen gebildet wird und die Formatspezifizierung (siehe auch Variablen / Konstanten / Datentypen) des einzulesenden Werts aufnimmt. Dahinter wird durch ein Komma getrennt die Variable angegeben, die die Eingabe aufnehmen soll. Der Unterschied zum printf() besteht darin, dass vor der Variablen der Adressoperator & (siehe Operatoren) steht, da der scanf() direkt auf den Arbeitsspeicherbereich zugreift.

Achtung: Das Weglassen des Adressoperators & ist auch ein häufiger Fehler von Anfänger, der immer wieder zu Programmabstürzen führt.
Ein weiterer Fehler ist den scanf() wie den printf() zu benutzen. Das heißt folgender scanf() funktioniert nicht.

scanf("Bitte geben Sie eine Zahl ein: %d\n", &zahl);


Probleme mit dem scanf() und Lösungen

Ein Problem des scanf() ist die Pufferung der Eingabe, das heißt die Eingabe durchläuft den Eingabepuffer. Wenn man jetzt eine Eingabe tätigt, besteht diese aus dem tatsächlichen Eingabewert und einem Return-Zeichen, um die Eingabe zu beenden. Der scanf() nimmt nun den Wert auf und übergibt diesen an die entsprechende Variable. Was im Tastaturpuffer verbleibt ist das Return-Zeichen. Der nächste scanf() mit der Formatspezifikation %c bzw. %s übernimmt dieses Zeichen und es sieht so aus, als ob der Befehl übersprungen wird.

Beispiel:

#include <stdio.h> 

void main()
{
  char var1,var2;
  
  printf("Eingabe 1. Buchstabe : ");
  scanf("%c",&var1);
  printf("Eingabe 2. Buchstabe : ");
  scanf("%c",&var2);
  printf("Sie haben folgende Buchstaben eingegeben: %c %c",var1,var2);
}


Bildschirmausgabe bei versuchter Eingabe von a und b:

Eingabe 1. Buchstabe : a
Eingabe 2. Buchstabe
Sie haben folgende Buchstaben eingegeben: a


Warum wird der zweite Buchstabe immer übersprungen und nicht ausgegeben?
In diesem Beispiel wurde ja als erstes der Buchstabe "a" eingegeben und ENTER gedrückt. Dieses ENTER (ASCII-Code = 10 = \n = newline) befindet sich immer noch im Puffer der Standardeingabe und wird automatisch für das zweite Zeichen verwendet.


Lösungen für dieses Problem

1. Möglichkeit: Sie benutzen eine Funktion namens fflush(). Diese Funktion entleert den Tastatur-puffer. (Funktioniert nicht auf jedem Betriebssystem (speziell nicht unter Linux))

Beispiel:

#include <stdio.h>
void main() 
{
  char var1,var2;

  printf("Eingabe 1. Buchstabe : ");
  scanf("%c",&var1);
  fflush(stdin);
  printf("Eingabe 2. Buchstabe : ");
  scanf("%c",&var2);
  fflush(stdin);
  printf("Sie haben folgende Buchstaben eingegeben : %c %c ",var1,var2);
}


Bildschirmausgabe für die Eingaben a und b:

Eingabe 1. Buchstabe: a
Eingabe 2. Buchstabe: b
Sie haben folgende Buchstaben eingegeben: a b

 

2. Möglichkeit: Mit Hilfe einer do while-Schleife zieht man das Newline-Zeichen aus dem Puffer heraus.

Beispiel:

#include <stdio.h>

void main()
{
  char var1,var2;

  printf("Eingabe 1. Buchstabe : ");

  do 
  {
    scanf("%c",&var1);
  }
  while ( getchar() != '\n' );

  printf("Eigabe 2. Buchstabe : ");

  do
  {
    scanf("%c",&var2);
  }
  while ( getchar() != '\n' );

  printf("%c %c\n",var1,var2);
}

 
Bildschimausgabe für die Eingaben a und b:

Eingabe 1. Buchstabe: a
Eingabe 2. Buchstabe: b
a b

 

3. Möglichkeit: Sie verwenden andere Funktionen für die Standardeingabe. Zum Beispiel fgets() und sscanf().

 

Ein weiteres Problem des scanf() ist die Eingabe von Zeichenketten mit Leerzeichen. scanf() beendet das einlesen nicht beim Return-Zeichen, sondern schon beim ersten Leerzeichen. Der Rest der Eingabe verbleibt im Puffer.

Beispiel: 

#include <stdio.h> 

void main()
{
  char var1[20];

  printf("Eingabe einer Zeichenkette: ");
  scanf("%s",&var1);
  printf("Ausgabe: %s\n",var1);
}

 

Bildschirmausgabe für die Eingabe "Hallo Welt":

Eingabe einer Zeichenkette: Hallo Welt!
Ausgabe: Hallo