Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_C-03 (scanf).doc
Скачиваний:
1
Добавлен:
21.11.2019
Размер:
96.77 Кб
Скачать

Возвращаемое значение

Функция scanf возвращает число успешно прочитанных, преобразованных и запомненных в переменных полей.

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

Если не прочитано ни одно поле, то функция возвращает нуль.

Если scanf пытается прочесть EOF (при вводе с клавиатуры комбинация CTRL+Z) или если перед преобразованием возникла ошибка, то функция возвращает EOF.

Таким образом, функция scanf прерывает работу, если:

1) исчерпана форматная строка (нормальное завершение);

2) очередной введенный символ не совпадает с соответствующим непробельным символом в форматной строке;

3) из входного потока считывается EOF.

Форматная строка функции scanf

Хотя для scanf структура форматной строки та же, что и для printf, у этих функций есть некоторые различия в деталях интерпретации форматной строки.

При вызове функция scanf выполняет следующие действия:

  • последовательно просматривает форматную строку,

  • по очереди выбирает из нее форматирующие элементы, и

  • применяет их к очередным полям ввода.

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

I. Пробельные символы в форматной строке

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

Т.е. один пробельный символ в форматной строке соответствует любому количеству и любой комбинации пробельных символов во входном потоке (включая и ни одного).

Поэтому фактически, за исключением случая спецификации %c, пробельные символы внутри форматной строки игнорируются.

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

ЗАДАНИЕ 2 (влияние пробельных символов)

1. Для выполнения задания, используя операцию File|Save as … создать копию файла task1.c с именем task2.c.

2. В новом файле в начало форматной строки функции scanf добавить пробел.

3. Запустить программу. Изменилось ли что-нибудь в ее поведении?

4. Запустить программу еще раз и попробовать перед набором числа ввести пробелы, табуляции. Повлияло ли это как-то на вывод результата?

Замечание

Иногда имеет смысл начинать форматную строку с пробельного символа, чтобы убрать из потока ввода лишний символ '\n', который мог остаться от нажатия Enter при завершении предыдущей операции ввода.

II. Непробельные символы в форматной строке

Непробельный символ заставляет scanf считать и пропустить аналогичный непробельный символ во входном потоке. Если очередной символ из потока не совпадает с указанным в форматной строке, то scanf прерывает работу.

Замечание

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

ЗАДАНИЕ 3 (влияние непробельных символов)

1. Создать копию файла task1.c с именем task3.c.

2. Переменную x инициализировать значением 123.

3. В начало форматной строки добавить одну латинскую букву, например, w.

4. Откомпилировать и запустить программу. Далее дважды выполнить программу.

а) В первый раз ввести w, некоторое число и нажать Enter. Есть ли ожидаемый результат?

б) Во второй раз ввести вместо w любую другую латинскую букву, а затем опять число. Что изменилось? Как можно объяснить результат?

5. В определении переменной x убрать инициализацию. Повторить действия пункта 4-б. Как можно объяснить результат?

6. Добавить в программу вывод возвращаемого функцией scanf значения:

Vyvedeno polei: …

Откомпилировать и выполнить программу. Объяснить результаты.

7. Не меняя остального, вынести определение переменной x на глобальный уровень (перед функцией main). Еще раз повторить действия пункта 4-б. Что изменилось? Как можно объяснить результат?

III. Спецификации формата (основные положения)

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

Результат каждого преобразования становится значением переменной, которой соответствует очередной адрес из списка аргументов.

Чаще всего спецификации формата состоят из:

а) знака % (процент);

б) одного из необязательных символов h, l или L, обозначающих модификатор типа (h — short, l — long, L —long double),

в) собственно символа преобразования, задающего базовый тип данных (см. справку в конце лабораторной работы).

Таким образом, общий вид основной части спецификации формата

%[модификатор] <тип>

ЗАДАНИЕ 4 (использование спецификаций формата)

1. Подготовить программу, в функции main которой определены две переменные x8 и y16 типа int.

2. В программе предусмотрен ввод значений в эти переменные с помощью одной функции scanf, причем для переменной x8 предусмотрен ввод в восьмеричной форме, а для y16 — в шестнадцатеричной.

3. Введенные с клавиатуры значения выводятся на экран в виде их десятичных значений.

4. Откомпилировать и запустить программу.

5. Попробовать вводить разные числа и проанализировать результаты: какие поля были выделены и как эти поля были преобразованы (для целых чисел компилятор отводит 2 байта, какое наибольшее число можно записать в такую ячейку?):

а) 10FF,

б) 7777777FF,

в) в функции printf изменить символ преобразования для переменной x8 на беззнаковое целое и повторить ввод значений пункта б.

6. Добавить в программу определение символьной переменной sym. Закомментировать строки с функциями scanf и printf, и добавить новые:

scanf("%c",&sym);

printf("a%cb",sym);

Запустить программу дважды. В первый раз ввести символ d и нажать Enter. Во второй раз сразу нажать Enter. Объяснить работу программы в каждом случае.

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