Функция scanf() — функция форматированного ввода языка Си, осуществляющая ввод со стандартного потока stdin в соответствии с форматом. При необходимости функция преобразует вводимые символы в числа в соответствии с форматом и сохраняет данные по указанным адресам. Функция прекращает ввод после первой же ошибки, оставляя ошибочный символ непрочитанным. Функция scanf() возвращает количество прочитанных и преобразованных полей или признак конца файла (EOF) при достижении конца файла.
Функция scanf() — это функция из стандартной библиотеки ввода-вывода.
Объявление прототипа функции scanf() находится в файле заголовков stdio.h, поэтому программы, использующие эту функцию, должны включать следующую директиву препроцессора:
#include <stdio.h>
Синтаксис функции scanf() аналогичен синтаксису функции printf().
int scanf()(формат[,список указателей]...)
Форматная строка обычно содержит спецификации преобразования, которые используются для управления вводом. В форматную строку могут входить следующие элементы:
Для функции scanf() спецификация преобразования может состоять из следующих символов:
Допустимые значения символа-спецификатора приведены в таблице 1.
Таблица 1    
Символ-спецификаторДанные на вводе; тип аргумента
dДесятичное целое; int *
iЦелое; int *. Целое может быть восьмеричным (с нулем слева) или шестнадцатеричным (с 0x или 0X слева)
oВосьмеричное целое (с нулем слева или без него); int *.
uБеззнаковое целое десятичное число; int *.
xШестнадцатеричное целое (с 0x или 0X слева или без них); int *.
cСимвол; char *. Символы ввода размещаются в указанном массиве символов в количестве, заданном шириной поля, по умолчанию это количество равно 1. Символ '\0' (признак конца строки) не добавляется. Символы-разделители здесь рассматриваются как обычные символы и поступают в аргумент.
sСтрока символов, отличных от символов-разделителей (записывается без двойных кавычек); char *, указывающий на массив размера достаточного, чтобы вместить строку и добавленный к ней символ '\0'.
e, f, gЧисло с плавающей точкой; float *. Формат ввода для float состоит из необязательного знака, строки цифр, возможно с десятичной точкой, и необязательного порядка, состоящего из E или e и целого, возможно со знаком
pЗначение указателя в виде, в котором функция printf() его напечатает; void *.
nЗаписывает в аргумент число символов, прочитанных к данному моменту данным вызовом функции; int *. Никакого чтения ввода не происходит. Счетчик числа введенных элементов не увеличивается.
[...]Выбирает из ввода самую длинную ненулевую строку, состоящую из символов, заданных в квадратных скобках; char *. В конце строки добавляется символ '\0'. Спецификатор вида []...] включает символ ] в заданное множество символов.
[^...]Выбирает из ввода самую длинную ненулевую строку, состоящую из символов, не входящих в заданное в квадратных скобках множество; char *. Спецификатор вида [^]...] включает символ ] в заданное множество символов.
%Обычный символ %; присваивание не делается.

Функция scanf() использует адрес аргумента для размещения преобразованных данных. Распространенной ошибкой при использовании функции scanf() является отсутствии операции получения адреса (&). В этом случае функция scanf() интерпретирует значение аргумента как адрес и либо записывает данные в непредсказуемое место памяти, либо пытается сделать это в защищенную от записи область, что влечет аварийное завершение работы программы.
Значение, возвращаемое функцией scanf(), может использоваться для проверки правильности ввода данных.
Пример 1
#include <stdio.h>
int main()
{
  int number;

  printf("Введите число");
  while(scanf("%d",&number) != 1)
     printf("Ошибка. Попытайтесть еще раз ");
  printf("Спасибо. Вы ввели число %d\n", number);
...
}
Экран монотора:
Введите число  tyuh
Ошибка. Попытайтесть еще раз Ошибка. Попытайтесть еще раз Ошибка. Попытайтесть еще раз


В прим. 1 в программе сделана неудачная попытка обеспечить ввод того, что нужно программисту. При неудачном вводе числа "ошибочный" символ (в данном случае t) остается во входном потоке. При повторных вызовах функции scanf() ввод вновь начинается с этого символа и попытка ввода оказывается безуспешной. Необходимо убрать ненужные символы из входного потока. В прим. 2 показано, как можно очистить входную строку, используя функцию getchar().
Пример 2
#include <stdio.h>
int main()
{
  int number;

  printf("Введите число");
  while(scanf("%d",&number) != 1)
    {
     while(getchar() != '\n')
        ;           /* очищает строку*/
     printf("Ошибка. Попытайтесть еще раз ");
    }
  printf("Спасибо. Вы ввели число %d\n", number);
...
}
Экран монотора:
Введите  число  tyuh
Ошибка. Попытайтесть еще раз 34
Спасибо. Вы ввели число 34