Ввод данных в языке Си. Функция scanf
Вернёмся к последнему листингу прошлого шага:
Листинг 1.
#include <stdio.h>
int main(void) {
int a, b, res;
a = 10;
b = 7;
res = a + b;
printf("%d + %d = %d\n", a, b, res);
return 0;
}
Основная задача этого шага — научиться получать данные от пользователя.
Для этого можно использовать функцию scanf
. Она, так же как и функция printf
, описана в заголовочном файле stdio.h
. Т.к. он у нас уже подключен в первой строке, то мы можем свободно использовать функцию scanf
в своей программе.
Чтобы считать данные, которые ввёл пользователь, и сохранить их в переменную, нужно вызвать функцию scanf
со следующими параметрами:

В двойных кавычках указывается спецификатор формата. В зависимости от того в какую переменную мы собираемся сохранять введённое значение, необходимо использовать соответствующий спецификатор формата.
Основные спецификаторы формата:
%d
— целые числа%f
— вещественное число типаfloat
%lf
— вещественное число типаdouble
(обозначениеlf
отlong float
)%c
— символ
Обратите внимание, что в функции scanf
для типов float
и double
используются различные спецификаторы формата.
После формат-строки нужно указать адрес переменной, в которую нужно сохранить данные. Чтобы указать адрес переменной достаточно перед её именем записать знак & (амперсанд), как на рисунке выше.
Частая ошибка! Не забывайте ставить знак & перед именем переменной. Он нужен чтобы занести данные по адресу переменной. Об адресах вы узнаете в последующих уроках.
Напишем, наконец-таки, программу сложения двух чисел.
Листинг 2.
#include <stdio.h>
int main(void) {
int a, b, res;
scanf("%d", &a); // считываем целое значение в переменную a
scanf("%d", &b); // считываем целое значение в переменную b
res = a + b;
printf("%d + %d = %d\n", a, b, res);
return 0;
}
Скомпилируйте и запустите эту программу. После того, как программа запущена она будет ждать, пока вы введёте данные. Мы с вами знаем какие данные нужно вводить, т.к. мы писали эту программу. Для других пользователей, которые код программы не увидят, хорошо бы вывести на экран подсказку, какие данные нужно ввести. Посмотрите как это реализовано в следующем примере.
Эта программа будет полезна тем, кто следит за своим здоровьем. Данная программа подсчитывает уроверь базового обмена веществ по формуле Миффлина-Сан Жеора исходя из данных, которые вы введёте (возраст, рост и вес).
Листинг 3.
#include <stdio.h>
int main(void){
int age, height, weight;
double bov_m, bov_f;
printf("Vash vozrast?(god)\n");
scanf("%d", &age); // считываем целое значение в переменную age
printf("Vash rost?(cm)\n");
scanf("%d", &height); // считываем значение в переменную height
printf("Vash ves?(kg)\n");
scanf("%d", &weight); // считываем значение в переменную weight
bov_m = 10*weight + 6.25*height - 5*age + 5;
bov_f = 10*weight + 6.25*height - 5*age - 161;
printf("| BMR |\n");
printf("| male | female |\n");
printf("|%8.2f|%8.2f|\n",bov_m, bov_f);
return 0;
}
На самом деле, функция scanf
– функция форматного ввода. Она устроена чуть ли не сложнее, чем printf
. Но рассказывать новичку об особенностях её работы значит понапрасну грузить его лишней информацией. На данном этапе вам будет достаточно и этих знаний, а когда появится необходимость использовать что-то большее, вы с этим сможете сами разобраться. А может и я в каком-нибудь уроке расскажу.
Практика
Исследовательские задачи для хакеров
- Попробуйте удалить в программе Листинг 2 символ
&
в какой-нибудь функцииscanf
. Посмотрите какую ошибку выдаст компилятор. - Попробуйте использовать
%f
для типаdouble
, а%lf
для типаfloat
. Каковы результаты? Напишите об этом в комментариях к этому уроку. Не забудьте указать название вашей IDE или компилятора.
Дополнительные материалы
- пока нет