Ввод в консоли. Функция scanf


Для ввода данных в консоли может использоваться функция scanf(). Эта функция определена в заголовочном файле stdio.h (там же, где и функция printf) и имеет следующее формальное определение:

1
scanf(форматная_строка, аргументы)
И форматная_строка, и аргументы для функции scanf обязательны.

Форматная_строка содержит спецификации преобразования, которые определяют вводимые данные. Общий вид спецификаций преобразования:

1
% * ширина_поля модификатор спецификатор
Из этих элементов обязательны только два: знак процента % и спецификатор.

Спецификатор определяет тип вводимых данных:

%c: считывает один символ

%d: считывает десятичное целое число

%i: считывает целое число в любой системе (десятичной, шестнадцатеричной, восьмеричной)

%u: считывает положительное целое число

%e: считывает число с плавающей точкой в экспоненциальной форме

%E: считывает число с плавающей точкой в экспоненциальной форме с заглавным символом экспоненты

%f: считывает число с плавающей точкой

%F: считывает число с плавающей точкой

%g: считывает число с плавающей точкой

%G: считывает число с плавающей точкой

%o: считывает восьмеричное число

%x: считывает шестнадцатеричное число

%X: считывает шестнадцатеричное число

%s: считывает строку

%%: считывает символ процента

Символ звездочки * в спецификации преобразования позволяет пропустить при вводе водимые символы для типа, указанного через спецификатор.

Ширина_поля представляет целое положительное число, которое позволяет определить, какое количество байтов будет учитываться при вводе.

Модификаторы позволяют конкретизировать тип данных. В частности, есть следующие модификаторы:

h: для ввода значений типа short int (%hd)

l: для ввода значений типа long int (%ld) или double (%lf, %le)

L: для ввода значений типа long double (%Lf, %Le)

В качестве аргументов в функцию scanf() передаются адреса переменной, которая будет получать введенное значение. Для получения адреса переменной перед ее именем ставится знак амперсанда &. Например, если переменная называется age, то ее адрес мы можем получить с помощью выражения &age.

Например, введем с консоли числовое значение:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main(void)
{
int age;
printf("Input your age:");
scanf("%d", &age);

printf("age = %d", age);
return 0;
}
Здесь вводится значение для переменной age, которая представляет тип int, поэтому в форматную строку в функции scanf передается спецификатор %d. Здесь не используется ни символ звездочки, ни ширина поля, ни модификаторы. Вторым параметром идет адрес переменной age - &age.

После ввода значения мы можем его использовать, например, вывести на консоль:

Input your age:44
age = 44
Аналогичен будет ввод данных других типов:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

int main(void)
{
int age;
char name[10];
// вводим возраст
printf("Your age: ");
scanf("%d", &age);
// вводим имя
printf("Your name: ");
scanf("%10s", &name);

printf("Name: %s \t Age = %d",name, age);
return 0;
}
Здесь для имени выделяется 10 символов. Теоретически мы можем ввести и большее количество символов, но чтобы только 10 из них учитывались, в строку форматирования передается ширина поля, которая представляет 10 символов - %10s. Возможный консольный вывод:

Your age: 24
Your name: Tom
Name: Tom Age = 24
Можно сразу вводить несколько значений. В этом случае в качестве разделителя используется пробел:

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main(void)
{
int age;
char name[10];
float weight;
scanf("%d %s %f", &age, &name, &weight);

printf("Name: %s \t Age = %d \t Weight = %f",name, age, weight);
return 0;
}
Консольный ввод-вывод:

23 Tom 55.34
Name: Tom Age = 23 Weight = 55.340000