Ввод в консоли. Функция 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