Beitragsseiten

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