Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++ лекции.doc
Скачиваний:
22
Добавлен:
21.04.2019
Размер:
536.06 Кб
Скачать

6. Считывание данных с консоли

Только вывода данных на экран не достаточно для создания полноценных программ. Необходимо познакомиться и с передачей данных в программу. Один из простейших способов задать некоторую величину в программе (помимо использования литеральной константы) — это считывание данных с консоли. Для этого можно использовать функцию форматированного ввода scanf из библиотеки stdio.h.

Как и в функции printf, первым аргументом функции scanf должна быть форматная строка. Она показывает, в каком формате и в каком порядке должны быть введены данные. Вторым и последующими аргументами могут быть адреса переменных, которые необходимо заполнить вводимыми с клавиатуры данными. Например:

#include <stdio.h>

int main()

{

int input_data;

scanf("%d", &input_data);

}

Внимание! В функции scanf перед именем переменной обязательно пишется символ «&»! Если вы не напишете этот символ — скорее всего произойдет системная ошибка и программа аварийно завершится. Что означает символ «&» (амперсанд) — вы узнаете несколько позже.

Комментарий для нетерпеливых: амперсанд в C — это получение адреса переменной. Таким образом, в функию scanf передается не значение, а адрес переменной.

Во время выполнения этой программы в момент выполнения функции scanf программа приостановится и будет ожидать от пользователя ввода целочисленного значения (именно целочисленного, поскольку в форматной строке написан символ %d). Когда пользователь (например, вы) наберет некоторое число и нажмет ввод (энтер), в переменную input запишется введенное им значение.

В приведенной ниже таблице представлены некоторые возможные варианты ввода и результат этого ввода.

int var;

scanf("%d", &var);

Введено с клавиатуры

В переменной var

123

123

123z

123

z123

мусор

0x1FA1

0

Заметьте, что в третьем случае инициализации не произойдет, поскольку «z123» - это не целочисленный литерал, а строковый (с точки зрения форматированного ввода). В последнем примере целочисленным (%d) литералом является только нуль, соответственно только он и будет записан в переменную, а всё остальное будет отброшено. Что бы считать последний пример, как шестнадцатеричное представление целого числа, необходимо использовать символ %X.

Функция scanf может одновременно считывать несколько значений. Для этого необходимо указать несколько форматирующих последовательностей и передать в функцию несколько переменных.

int first, second;

scanf("%d%d", &first, &second);

scanf("%d %d", &first, &second);

scanf("%d\t%d", &first, &second);

scanf("%d\n%d", &first, &second);

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

int var1, var2;

scanf("%d %d", &var1, &var2);

Введено с клавиатуры (\t — табуляция, перевод или конец строки — нажатие клавиши энтер)

В переменных var1 и var2 (через запятую)

11 12

11,12

11

12

11,12

11 12

11,12

11\t \t

\t\t12

11,12

a

111

мусор,мусор (после первого же нажатия энтер)

11 a

11,мусор

11

a

11,мусор

Если же между вводимыми переменными находится некоторый текст — вторая и последующая переменные будут успешно заполнены в том и только в том случае, если пользователь введет этот текст:

int first, second;

scanf("%d tExT %d", &first, &second);

Введено с клавиатуры

В переменных (через запятую)

11 tExT 12

11,12

11tExT\t12

11,12

11text12

11,мусор

Как вы можете заметить, функция scanf игнорирует все пробелы, табуляции и переводы строки при вводе.

Вообще считывать более одной переменной одновременно с консоли обычно не следует, поскольку это вводит в заблуждение пользователя и лишает вас возможности контролировать введенные данные.

Впрочем, это не относится к форматированному считыванию данных из файла.

С другой стороны, сопровождать каждый вызов функции форматированного ввода выводом некоторого текста, объясняющего пользователю, что от него ждет программа — очень хороший способ получить нужные данные:

int main()

{

int value;

printf("Enter int value: ");

scanf("%d", &value);

printf("You have entered %d", value);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]