Функция scanf() в Си отвечает за ввод информации. Каждый язык программирования нужен для того, чтобы отдавать команды процессору для обработки определенной информации. Поэтому в каждом языке программирования присутствуют собственные инструменты для ввода и вывода информации. В Си эти инструменты представлены двумя функциями:
printf() — отвечает за вывод;
scanf() — отвечает за ввод.
О выводе информации при помощи функции printf() мы поговорим в следующих статьях, а на функции scanf() в Си остановимся поподробнее.
Функция scan() в Си
Функция scanf() считывает вводимые символы разного формата. При считывании она автоматически конвертирует вводимые данные в нужный программисту формат. По сути, scanf() является обратной функцией printf(). Шаблон «сканф» в Си выглядит так:
int scanf(“форматная строка“, «место для сохранения считанных значений»)
При помощи «форматной строки» разработчик задает инструкции для интерпретации вводимых данных. Форматная строка может состоять из 3-х типов символов:
преобразующий спецификатор — значение, задающее инструкции, плюс знак «%»;
специальный разделяющий символ — это «пробел» между несколькими спецификаторами;
не специальный символ.
Преобразующий спецификатор
Преобразующий спецификатор начинается со специального символа «проценты». Он нужен, чтобы сообщить функции scanf(), какой тип данных необходимо будет считать.
Преобразующие спецификаторы имеют следующие значения:
«%а» — чтение значения с «плавающей точкой»;
«%c» — считывание одиночного символа;
«%d» — чтение целого десятичного числа;
«%i» — считывание чисел разных форматов: десятичного, восьмеричного, шестнадцатиричного;
«%e», «%f», «%g» — чтение числа с «плавающей точкой»;
«%о» — считывание восьмеричного числа;
«%s» — чтение строки;
«%х» — считывание шестнадцатеричного числа;
«%р» — чтение указателя;
«%n» — передать значение уже считанных знаков;
«%u» — считывание целого десятичного числа, не беря во внимание знак;
«%[]» — чтение всех отсканированных символов;
«%%» — считывание знака «проценты».
Примеры использования scanf() в Си
Составим небольшую программку, которая будет считывать восьмеричные и шестнадцатеричные числа:
#include <stdio.h>
int main(void)
{
int q, w;
scanf(“%o%x“, &q, &w);
printf (“% o %x“, q, w)
return 0;
}
В этой программе при помощи спецификаторов «%o» и «%x» указали, какие значения нам необходимо считать. После считывания мы указали две переменные «q» и «w», куда будут сохраняться значения.
Чтение целого десятичного числа без учета знака:
unsigned number;
scanf(“%u“, &number);
Создадим программу, считывающую строки. Важно отметить, что функция scanf() в Си будет считывать строку до тех пор, пока не встретит какой-либо разделитель. Таким разделителем может быть:
пробел,
разделение строк,
табуляция,
вертикальная табуляция,
и др.
Все, что функция scanf() считает до разделителя, поместится в специальный символьный массив. Программа в Си для чтения строки при помощи scanf():
#include <stdio.h>
int main(void)
{
char str[100];
printf("Напишите что-нибудь: ");
scanf("%s", str);
printf("Вот то, что вы написали: %s", str);
return 0;
}
Если запустить такую программу, то scanf() не считает все, что напишет пользователь, а лишь первое слово. После первого слова последует «пробел», а после «пробела» scanf() прекращает свою работу. Поэтому если нужно получить от пользователя большеодного слова, тогда лучше применять функцию «gets()».
Функция scanf() в Си может применяться для арифметических операций. Например, в следующей программе мы сложим 2 вводимых числа:
#include <stdio.h>
int main(void) {
int x, y, result;
scanf("%d", &x); // считать первое целое значение и адресовать его в переменную «x»
scanf("%d", &y); // считать второе целое значение и адресовать его в переменную «y»
result = x + y;
printf("%d + %d = %d\n", x, y, result);
return 0;
}
Разница между scanf() и scanf_s() в Си
В функциональности этих функций нет никакой разницы, просто scanf() появилась в первых версиях языка С, поэтому считается менее защищенной. Обычно при работе со scanf() в современных компиляторах требуется наличие строки «#define _CRT_SECURE_NO_WARNINGS» в кодовом документе.
Либо можно применять усовершенствованную функцию scanf_s(), которая считается уже защищенной и не требует наличия вышеописанной строки.
Заключение
В программах информация не только выводится, но и принимается. Теперь вы знаете, что при помощи функции scanf() в Си можно принять любые данные, главное — правильно обозначить спецификатор. Немного потренировавшись, вы поймете, что с функцией «сканф» в Си работать не сложнее, чем с функцией printf() в этом же языке.
Другое