Найти в Дзене
Old Programmer

Язык программирования C. Форматный ввод. Функция scanf (спецификаторы и модификаторы)

Мой канал Old Programmer, а здесь: Программирование. Тематическое оглавление моего Zen-канала (Old Programmer). А здесь собраны все ссылки, касающиеся языка C/C++.
Язык программирования C. Функция printf. Форматный вывод (спецификаторы и модификаторы)
Язык программирования C для начинающих. Путеводитель по моему каналу Old Programmer
О функции scanf()
Оглавление

Мой канал Old Programmer, а здесь: Программирование. Тематическое оглавление моего Zen-канала (Old Programmer). А здесь собраны все ссылки, касающиеся языка C/C++.

  • Язык программирования C. Функция printf. Форматный вывод (спецификаторы и модификаторы)
  • Язык программирования C для начинающих. Путеводитель по моему каналу Old Programmer

О стандартной функции scanf() языка C

Функция scanf, стандартная функция языка C, используется для форматного ввода данных. На функцию printf она очень похожа потому, что использует те же спецификаторы и модификаторы. В частности таблица (см. рисунок 1) из статьи о printf в частично подходит и для функции scanf. Так что есть смысл познакомиться поближе с printf, а потом вернуться к данной статье.

Рисунок 1
Рисунок 1

Примеры использования

Рассмотрим примеры использования функции scanf().

int a;
scanf("%d",&a);
printf("%d",a);

Как видно из примера ввод целого десятичного числа (32-битового по умолчанию) демонстрирует аналогию с его выводом.

int a,b,c,d;
scanf("%d %d %d %d",&a,&b,&c,&d);
printf("%d %d %d %d",a,b,c,d);

Ввод и вывод четырех десятичных чисел через пробел. Т.е. при вводе между числами должен стоять пробел.

Или так, через запятую.

int a,b,c,d;
scanf("%d,%d,%d,%d",&a,&b,&c,&d);
printf("%d,%d,%d,%d",a,b,c,d);

т.е. при вводе между числами должна стоять запятая.

Очень интересен флаг звездочка, позволяющий пропускать между операндами данные определенного типа. Например

int a,b;
scanf("%d%*10s%d",&a,&b);
printf("%d,%d",a,b);

Между вводимыми числами пропускается 10 знаков. Например
3457qwertyuiop44

Переменным a и b будет присвоено соответственно 3457 и 44. Или так

char s1[100], s2[100];
scanf("%*d%s%*d%s",s1,s2);
printf("%s\n%s\n",s1,s2);

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

А вот очень важный пример для чисел с плавающей точкой.

float f;
double d;
scanf("%f %lf",&f,&d);
printf("%f %lf\n",f,d);

23.456 23.456
23.455999 23.456000

Для вещественных чисел типа double (двойной точности) следует использовать модификатор 'l', т.е. результирующий спецификатор будет 'lf'. Кстати обратим внимание, что тип float легко теряет точность. Для серьезных расчетов лучше использовать double.

А вот примеры целыми числами двойной точности (64-битовые).

long long a1, a2, a3, a4;
scanf("%llu,%llu,%llx,%llx", &a1, &a2, &a3, &a4);
printf("%llu, %llx, %llx, %llu\n", a1, a2, a3, a4);

2323443242234,2323443242234,0xfffffaaaaaaa,0xfffffaaaaaaa
2323443242234, 21cf80254fa, fffffaaaaaaa, 281474887232170

А вот ввод строки с ограничение его длины.

char s1[100];
scanf("%5s", s1);
printf("%s\n", s1);

Ввод не более 5 символов.

Ну и наконец совсем интересное

char s1[100];
scanf("%[a-z]", s1);
printf("%s\n", s1);

Ввод строки, состоящей из символов [a-z].

Важное замечание

Функция scanf() возвращает количество принятых элементов. По этому значению можно судить о том, насколько правильно был осуществлен ввод. Например

int p = scanf("%d %d", &n, &m);
printf("\n%d\n", p);

Переменной p будет присвоено количество введенных элементов. Если p меньше 2, то можно сделать вывод, что с вводом что-то не так.

До свиданья!

Стране нужны программисты! Подписываемся на мой канал Old Programmer .

В свободном доступе
В свободном доступе