Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник Моя первая программа на С++.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
6 Мб
Скачать
☆

Использование функции scanf()

Давайте познакомимся с функцией scanf() поближе. Рассмотрим следующую программу:

main()

{

int count;

printf("Пожалуйста, введите целое число и нажмите Enter: "); scanf("%d", &count);

printf("Подтвердите ввод числа: %d", count);

}

Что произойдет во время работы программы?

    1. Функция printf() выведет на экран подсказку:

Пожалуйста, введите целое число и нажмите Enter:

Код «новая строка» отсутствует, поэтому курсор остановится в конце строки подсказки.

    1. Программа ждет, пока пользователь введет информацию.

    2. Вы набираете число и нажимаете Enter.

    3. Функция scanf() просматривает входной поток и определяет, какие символы можно ввести, а какие следует игнорировать. Если цифровые символы предшествуют нецифровым, она продолжает ска- нирование до тех пор, пока не встретится нецифровой символ или пробел. Цифровые символы преобразуются в число и заносятся по адресу переменной. Если нецифровые символы предшест- вуют цифровым, функция прекращает работу и вся напечатанная последовательность игнорирует- ся.

    4. Курсор переходит к началу следующей строки.

    5. Функция printf() выводит на экран значение, присвоенное переменной, сопровождая его сообще- нием: «Подтвердите ввод числа».

Вы можете использовать столько функций scanf(), сколько необходимо для ввода данных. В качестве примера Листинг 5.1 демонстрирует текст программы, в которой вводятся переменные четырех типов: int, float, char и строка. Обратите внимание, что оператор получения адреса используется для всех перемен- ных, кроме строки.

Листинг 5.1. Программа, в которой вводятся четыре переменные. /*scanf3.c*/

main()

{

int count; float amount;

char letter; char name[15];

puts("Введите целое число и нажмите Enter"); scanf("%d", &count);

puts("Введите вещественное число и нажмите Enter");

scanf("%f", &amount); puts("Введите символ и нажмите Enter"); scanf("%c", &letter); puts("Введите строку и нажмите Enter"); scanf("%s", name);

printf("%d %6.2f %c %s", count, amount, letter, name);

}

Разрешается определить символьную переменную как int, но для ввода ее значения следует использовать указатель %c, и ни в коем случае не %d. Указатель %d можно использовать, чтобы отобразить ASCII-код какого-либо символа с помощью функции printf().

Выбор соответствующих средств ввода данных

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

Допустим, вы пишете программу, где надо ввести данные об объеме продаж:

main()

{

float amount;

puts("Введите сумму продаж: "); scanf("%f", &amount); printf("\nСумма составляет %f", amount);

}

Так как суммы обычно указывают в долларах, пользователь может, вводя данные в эту программу, поста- вить знак доллара: $45.65. Этот знак, естественно, включается во входной поток. Но в данном случае он не соответствует формату, ожидаемому функцией scanf(), а так как именно этот знак стоит на первом мес- те во входном потоке, scanf() проигнорирует весь ввод целиком. Не самый лучший способ вести дела!

Именно для предотвращения подобных казусов и следует вводить специальные инструкции перед каждой функцией scanf():

puts("Пожалуйста, введите сумму продаж. Вводите\n"); puts("только сумму. Не используйте знак доллара или\n"); puts("запятую между цифрами. Правильный

формат: 4567.87\n");

puts("Неправильный формат: $4567,87\n");

puts(" Спасибо\n");

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

scanf("$%f", &amount);

Знак $ в данном случае говорит программе, что во входном потоке первым значимым символом должен быть знак доллара, так что, когда пользователь вводит число $45.65, программа ожидает этого, и функ- ция scanf() не прекращает работу, а просто отбрасывает знак доллара и заносит следующее числовое значение в адрес переменной amount.

Следует помнить, что любой текст, внесенный в строку формата, должен быть непременно введен и во входной поток, причем строго на том же месте по отношению к указателям формата. Если символы не появятся в ожидаемом месте, все введенные в этом пункте данные будут проигнорированы. Например, когда знак $ внесен в строку формата, ввод игнорируется, если этот символ отсутствует в начале входно- го потока. Если вы используете какие-нибудь литералы в строке формата, позаботьтесь о том, чтобы пользователь был поставлен в известность относительно того, что именно он должен ввести:

puts("Пожалуйста, введите сумму продаж. Начните\n"); puts("число со знака доллара.

Правильный формат: $4567.87\n");

puts("Не используйте запятую внутри числа.\n");

Знак доллара не вводится в значение переменной и не выводится на экран, когда вы используете функ- цию printf(). Он появляется на экране только в момент ввода данных, так же, как и остальные символы, в режиме эха. Если вы хотите, чтобы знак доллара отображался вместе со значением переменной в даль- нейшем, следует задать его в строке формата функции printf():

printf("Сумма продаж составляет $%f", amount);

но теперь это будет уже другой символ $, выведенный на дисплей с помощью функции printf(). Он поя- вится перед значением переменной, которое будет подставлено на место указателя формата %f.