Функции printf() и scanf() используются для ввода и вывода информации. Точнее, функция printf()заведует выводом, а функция scanf() - вводом. Эти две функции очень похожи между собой, поэтому рассмотрим сначала функцию printf(), а после перейдем к изучению scanf().
Чтобы работать с этими функциями без проблем, не забывайте подключать в своих приложениях библиотеку stdio.h
Функция printf()
Как уже упоминалась ранее, функция printf() является функцией вывода. Рассмотрим прототип данной функции:
Элементы, которые необходимо вывести на экран, нужно расположить в функции в таком порядке, в каком в управляющей строке расположены для них спецификаторы преобразования. Это связано с работой функции printf(). Функция выводит без изменений все символы управляющей строки за исключением спецификаторов преобразования. Когда функция находит в управляющей строке первый спецификатор преобразования, она подставляет значение второго параметра (т.е.argument1)на место спецификатора, предварительно преобразовав это значение в соответствии с данным спецификатором. Далее, найдя следующий спецификатор, функция подставляет на его место третий параметр и так далее. Рассмотрим примеры:
int numPages = 273;
printf("The book has %d pages.", numPages);
выведет на экран
The book has 273 pages.
float nQuantity = 100;
printf("They have eaten only %f%% from %d kilograms of food\n", nQuantity/3, 25);
выведет на экран
They have eaten only 33.333333% from 25 kilograms of food.
Функция scanf()
Как уже упоминалось в начале функция scanf() используется для обработки информации, введенной пользователем с клавиатуры. Несомненный плюс данной функции, что она может преобразовывать введенную информацию не только в символы, но и в числа, в том числе и в числа с плавающей точкой.
Возвращает эта функция число элементов, которые она успешно прочитала. Если она не прочла никаких элементов, функция возвращает значение 0. Функция scanf() вернет значение EOF, если обнаружит символ конца строки или символ конца файла, а также в случае ошибки.
Первый параметр функции - control-str - как и в предыдущей функции это управляющая строка, сопровождаемая списком параметров argument.
После управляющей строки идут параметры argument, каждый из которых является адресом переменной, в которую будет записано введенное и считанное значение. Следовательно,если мы используем функцию для чтения строки в символьный массив, в качестве аргумента мы передаем название символьного массива, в остальных случаях, то есть для чтения других типов - мы передаем название переменной со знаком амперсанта (&).
Управляющая строка указывает, в какие форматы должен быть преобразован вводимый текст. В ней также используются спецификаторы преобразования, их прототип похож на прототип спецификатора функции printf, но все же отличается. Вот как выглядит прототип спецификатора преобразования функции scanf():
% [*] [width] [{h | l | L}] type
Для того, чтобы отделить вводимые значения, функция scanf() использует символы, называемые служебными. К ним относятся символы перевода строки, табуляции и пробелы. Что сие значит: во время ввода информации пользователь должен после каждого введенного значения вводить служебный символ для того, чтобы показать функции, что он закончил ввод очередного значения. Единственное исключение - спецификатор %c, который читает каждый следующий символ, даже если этот символ является служебным. Приведем пример:
char name[15];
int age;
float salary;
printf("Input your name, age and your salary\n");
scanf("%s %d %f", name, &age, &salary);
printf("Name is %s\n Age is %d\n Salary is %6.2f\n", name, age, salary);
когда на экране появляется строка
Input your name, age and your salary
мы вводим
Bill
35 521.55
после этого на экране должна появиться строка
Name is Bill
Age is 35
Salary is 521.55
Модификатор * заставляет функцию scanf() игнорировать соответствующий ввод. То есть, если в спецификаторе преобразования стоит звездочка, то функция введенное значение не записывает в переменную. Пример:
int num;
printf("Input 3 numbers:\n");
scanf("%*d %d %*d", &num);
printf("Second number is %d\n",num);
когда на экране появится строка
Input 3 numbers:
мы вводим
44 55 66
в результате чего на экране должна появиться строка
Second number is 55
Второй необязательный модификатор спецификатора - width - максимальная ширина поля. Ввод останавливается, когда достигнута максимальная ширина поля или при обнаружении служебного символа. После достижения максимальной ширины поля функция считает, что начался ввод следующего значения.
Использование необязательных префиксов h | l | L рассмотрено в таблице:
Использование префикса
| с типом спецификатора
| определяет тип
| l
| d, i, o, x или X
| long
| l
| u
| unsigned long
| l
| e, f, g, E или G
| double
| h
| d, i, o, x, или X
| short int
| h
| u
| unsigned short int
| L
| e, f, g, E или G
| long double
| Как Вы уже заметили, в контрольной строке функции scanf() между спецификаторами преобразования в примерах использовались пробелы. Пробел в контрольной строке означает, что нужно пропускать любой служебный символ перед следующим получаемым элементом. Так как практически все спецификаторы, за исключением %с, автоматически пропускают служебные символы, то:
int n;
float m;
строка кода
scanf("%d%f", &n, &m);
идентична
scanf(" %d %f", &n, &m);
Если же используется спецификатор преобразования %с, то без пробела перед этим спецификатором функция считает любой первый символ, в том числе и служебный. Но если же перед спецификатором %с стоит пробел, то функция считает первый неслужебный символ.
В контрольной строке можно также использовать обычные символы, отличные от пробела. Например,
scanf("%d + %f", &n, &m);
В этом примере функция будет ожидать от пользователя, что он введет между двумя значениями знак +. Если же не ввести с клавиатуры символ +, то в последующие элементы не будут занесены значения.
|