scanf, wscanf

From Appmethod Topics
Jump to: navigation, search

Go Up to stdio.h Index


Header File

stdio.h

Category

Console I/O Routines

Prototype

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

Description

Scans and formats input from the stdin stream.

Note: For Win32 and Win64 GUI applications, stdin must be redirected.

The scanf function:

  • Scans a series of input fields one character at a time.
  • Formats each field according to a corresponding format specifier passed in the format string *format.
  • vsscanf scans and formats input from a string, using an argument list.

There must be one format specifier and address for each input field.

scanf might stop scanning a particular field before it reaches the normal end-of-field (whitespace) character, or it might terminate entirely. For details about why this might happen, see When ...scanf Stops Scanning.

Note: scanf can lead to unexpected results if you diverge from an expected pattern. You must provide information that tells scanf how to synchronize at the end of a line.

The combination of gets or fgets followed by sscanf is safe and easy, and therefore recommended over scanf.

Return Value

On success, scanf returns the number of input fields successfully scanned, converted, and stored. The return value does not include scanned fields that were not stored.

On error:

  • If no fields were stored, scanf returns 0.
  • If scanf attempts to read at end-of-file or at end-of-string, it returns EOF.

More About scanf

Example

#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];
/* Input a label as a string of characters restricting to 20 characters */
   printf("\n\nPlease enter a label for the chart: ");
   scanf("%20s", label);
   fflush(stdin);  /* flush the input stream in case of bad input */
/* Input number of entries as an integer */
  printf("How many entries will there be? (less than 20) ");
  scanf("%d", &entries);
  fflush(stdin);   /* flush the input stream in case of bad input */
/* input a name restricting input to only letters uppercase or lowercase */
   for (loop=0;loop<entries;++loop)
   {
      printf("Entry %d\n", loop);
      printf("  Name   : ");
      scanf("%[A-Za-z]", entry[loop].name);
      fflush(stdin);  /* flush the input stream in case of bad input */
/* input an age as an integer */
      printf("  Age    : ");
      scanf("%d", &entry[loop].age);
      fflush(stdin);  /* flush the input stream in case of bad input */
/* input a salary as a float */
      printf("  Salary : ");
      scanf("%f", &entry[loop].salary);
      fflush(stdin); /* flush the input stream in case of bad input */
   }
/* Input a name, age, and salary as a string, integer, and double */
   printf("\nPlease enter your name, age and salary\n");
   scanf("%20s %d %lf", name, &age, &salary);
/* Print out the data that was input */
   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;
}

See Also