Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Нейбауэр А. Моя первая программа на С.doc
Скачиваний:
128
Добавлен:
02.05.2014
Размер:
3.75 Mб
Скачать

Использование функции 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);

}

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

Разрешается определить символьную переменную как 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.