scanf, wscanf

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu stdio.h - Index


Header-Datei

stdio.h

Kategorie

Konsolen-Ein-/Ausgaberoutinen

Prototyp

int scanf(const char *format[, address, ...]);
int wscanf(const wchar_t *format[, address, ...]);

Beschreibung

Untersucht und formatiert Eingaben aus dem Stream stdin.

Anmerkung: Für Win32- und Win64-GUI-Anwendungen muss stdin umgeleitet werden.

Die Funktion scanf:

  • Untersucht Zeichen für Zeichen eine Reihe von Eingabefeldern
  • Formatiert jedes Feld entsprechend den Formatbezeichnern, die in dem Format-String *format angegeben sind.
  • vsscanf untersucht und formatiert mithilfe einer Argumentliste die Eingabe aus einem String

Für jedes Eingabefeld muss es einen Formatbezeichner und eine Adresse geben.

scanf kann die Untersuchung eines bestimmten Feldes abbrechen, bevor das normale Feldendezeichen (Whitespace-Zeichen) erreicht ist, oder kann die gesamte Verarbeitung beenden. Einzelheiten über die möglichen Ursachen finden Sie unter Warum scanf die Untersuchung abbricht.

Anmerkung: scanf kann zu unerwarteten Ergebnissen führen, wenn Sie von dem erwarteten Muster abweichen. Sie müssen scanf Informationen darüber liefern, wie sich diese Funktion am Ende einer Zeile synchronisieren kann.

Die Kombination von gets oder fgets gefolgt von sscanf ist einfach und sicher, und daher auch gegenüber scanf vorzuziehen.

Rückgabewert

scanf gibt die Anzahl erfolgreich untersuchter, konvertierter und gespeicherter Eingabefelder zurück. Die untersuchten Felder, die nicht gespeichert wurden, werden nicht gezählt.

Bei einem Fehler:

  • Wurden keine Felder gespeichert, gibt scanf 0 zurück.
  • Versucht scanf, über das Dateiende oder das Zeilenende hinaus zu lesen, wird EOF zurückgegeben.

Weitere Informationen zu scanf

Beispiel

#include <stdio.h>
int main(void)
{
   char label[20];
   char name[20];
   int entries = 0;
   int loop, age;
   double salary;
   struct Entry_struct
   {
      char name[20];
      int   age;
      float salary;
   } entry[20];
/* Eingabe eines Labels als String von maximal 20 Zeichen Länge anfordern */
   printf("\n\nPlease enter a label for the chart: ");
   scanf("%20s", label);
   fflush(stdin);  /* Für den Fall einer ungültigen Eingabe Stream-Puffer leeren */
/* Anzahl der Einträge als Integer eingeben */
  printf("How many entries will there be? (less than 20) ");
  scanf("%d", &entries);
  fflush(stdin);  /* Für den Fall einer ungültigen Eingabe Stream-Puffer leeren */
/* Einen nur aus Buchstaben bestehenden Namen eingeben */
   for (loop=0;loop<entries;++loop)
   {
      printf("Entry %d\n", loop);
      printf("  Name   : ");
      scanf("%[A-Za-z]", entry[loop].name);
      fflush(stdin);  /* Für den Fall einer ungültigen Eingabe Stream-Puffer leeren */
/* Alter als ein Integer eingeben */
      printf("  Age    : ");
      scanf("%d", &entry[loop].age);
      fflush(stdin);  /* Für den Fall einer ungültigen Eingabe Stream-Puffer leeren */
/* Gehalt als Gleitkommazahl eingeben */
      printf("  Salary : ");
      scanf("%f", &entry[loop].salary);
      fflush(stdin);  /* Für den Fall einer ungültigen Eingabe Stream-Puffer leeren */
   }
/* Name, Age und Gehalt als String-, Integer- and double-Werte eingeben */
   printf("\nPlease enter your name, age and salary\n");
   scanf("%20s %d %lf", name, &age, &salary);
/* Die eingegebenen Daten anzeigen */
   printf("\n\nTable %s\n",label);
   printf("Compiled by %s  age %d  $%15.2lf\n", name, age, salary);
   printf("-----------------------------------------------------\n");
   for (loop=0;loop<entries;++loop)
      printf("%4d | %-20s | %5d | %15.2lf\n",
         loop + 1,
         entry[loop].name,
         entry[loop].age,
         entry[loop].salary);
   printf("-----------------------------------------------------\n");
   return 0;
}

Siehe auch