Спецификаторы форматной строки для функции форматного ввода
Спецификатор | Ожидаемый тип вводимых данных
| Тип аргумента |
d | Десятичное целое | int * |
o | Восьмеричное целое | int* |
x | Шестнадцатеричное целое | int* |
i | Десятичное, восьмеричное или шестнадцатеричное целое | int* |
u | Десятичное целое без знака | unsigned int * |
e,f, | Вещественное значение вида: [+|-]dddd [E|e[+|-]dd], состоящее из необязательного знака (+ или -), | float* |
g | ||
| последовательности из одной или более десятичных цифр, возможно, содержащих десятичную точку, и необязательного порядка (признак "е" или "Е", за которым следует целое значение, возможно, со знаком). (Для ввода значений переменных типа double используются спецификаторы "%1е", "%lf", "%lg". Для ввода значений переменных типа long double используются спецификаторы "%Le", "%Lf ', "%Lg".) |
|
с | Очередной читаемый символ должен всегда восприниматься как значимый символ. Пропуск начальных пробельных символов в этом случае подавляется. (Для ввода ближайшего, отличного от пробельного, символа необходимо использовать спецификацию "%ls".) | char* |
| ||
s | Строка символов, ограниченная справа и слева пробельными символами. Для чтения строк, не ограниченных пробельными символами, вместо спецификатора s следует использовать на- бор символов в квадратных скобках. Символы из входного потока читаются до первого символа, отличного от символов в квадратных скобках. Если же первым символом в квадратных скобках задан символ 'А', то символы из входного потока читаются до первого символа из квадратных скобок. | Указатель char * на массив символов, достаточный для размещения входной строки, плюс завершающий символ конца строки ('\0'), который добавляется автоматически |
Необязательные элементы спецификации преобразования имеют следующий смысл:
* - звездочка, следующая за символом процента, запрещает запись значения, прочитанного из входного потока по адресу, задаваемому аргументом. Последовательность кодов из входного потока прочитывается функцией scanf( ), но не преобразуется и не записывается в переменную, определенную очередным аргументом.
Ширина_поля - положительное десятичное целое, определяющее максимальное число символов, которое может быть прочитано из входного потока. Фактически может быть прочитано меньше символов, если встретится пробельный символ или символ, который не может быть преобразован по заданной спецификации.
Модификатор - позволяет задать длину переменной, в которую предполагается поместить вводимое значение. Модификатор может принимать следующие значения:
L - означает, что соответствующий спецификации преобразования аргумент должен указывать на объект типа long double;
l - означает, что аргумент должен быть указателем на переменную типа long, unsigned long или double;
h - означает, что аргумент должен быть указателем на тип short.
Приведем примеры ввода данных из входного потока с помощью функции scanf( ).
Предположим, что необходимо ввести со стандартного ввода следующие данные: десятичное число, одиночный символ и строку. Пусть во входном потоке присутствует дополнительная информация, необходимая для пояснения или идентификации вводимых данных. Например, вводимые данные могут иметь такой формат:
code: цифра строка1 символ строка2
Набранные жирным шрифтом элементы (цифра, символ и строка2) должны быть введены в программу, а элементы, набранные курсивом, будут использоваться для контроля (code:) и комментария (строка1).
Контроль заключается в том, что во входном потоке должна присутствовать именно строка "code:" (без кавычек). Строка строка1 используется для комментирования вводимых данных, может иметь произвольную длину и пропускается при вводе. Отметим, что строка1 и строка2 не должны содержать внутри себя пробелов. Текст программы приводится ниже:
Рассмотрим форматную строку функции scanf( ):
Строка "code:" присутствует во входном потоке для контроля вводимых данных и поэтому указана в форматной строке. Спецификации преобразования задают следующие действия:
%d - ввод десятичного целого;
%*s - пропуск строки (строка 1 в приведенной выше форме ввода);
%с - ввод одиночного символа;
%s - ввод строки.
Приведем результаты работы программы для трех различных наборов входных данных.
1. Последовательность символов исходных данных:
Результат выполнения программы:
Значением переменной ret является код возврата функции scanf( ). Число 3 говорит о том, что функция scanf( ) ввела данные без ошибки и было обработано 3 входных поля (строки "code:" и "поле2" пропускаются при вводе).
2. Последовательность символов исходных данных:
Результат выполнения программы:
Обратите внимание на то, что во входных данных пропущена строка перед символом D, использующаяся как комментарий. В результате символ D из входного потока был (в соответствии с форматной строкой) пропущен, а из строки "asd" в соответствии с требованием спецификации преобразования %с был введен символ 'а' в переменную с. Остаток строки "asd" (sd) был введен в массив символов s. Код возврата (ret=3) функции scanf( ) говорит о том, что функция завершила свою работу без ошибок и обработала 3 поля.
3. Последовательность символов исходных данных:
Результат выполнения программы:
Вместо предусмотренной в форматной строке последовательности символов в данных входного потока допущена ошибка (набрано слово cod: вместо code:). Функция scanf( ) завершается аварийно (код возврата равен 0). Функция printf( ) в качестве результата напечатала случайные значения переменных i, с и s ("мусор").
Необходимо иметь в виду, что функция scanf( ), обнаружив какую-либо ошибку при преобразовании данных входного потока, завершает свою работу, а необработанные данные остаются во входном потоке. Если функция scanf( ) применяется для организации диалога с пользователем, то, будучи активизирована повторно, она дочитает из входного потока "остатки" предыдущей порции данных, а не начнет анализ новой порции, введенной пользователем.
Предположим, что программа запрашивает у пользователя номер дома, в котором он живет. Программа обрабатывает код возврата функции scanf( ) в предположении, что во входных данных присутствует одно поле.
При правильном вводе данных (введено целое десятичное число) результат будет следующий:
Предположим, что пользователь ошибся и ввел, например, следующую последовательность символов "@%". (Эти символы будут введены, если нажаты клавиши '2' и '5', но на верхнем регистре, т.е. одновременно была нажата клавиша <Shift>.) В этом случае получится следующий результат:
Ошибочный символ @ прерывает работу функции scanf( ), но сам остается во входном потоке, и вновь делается попытка его преобразования при повторном вызове функции в теле цикла while. Однако эта и последующие попытки ввода оказываются безуспешными, и программа переходит к выполнению бесконечного цикла. Необходимо до предоставления пользователю новой попытки ввода номера дома убрать ненужные символы из входного потока. Это предусмотрено в следующем варианте той же программы:
Теперь при неправильном вводе данных результат будет таким:
- Предисловие
- Раздел 1. Полный курс программирования на стандартном языке Си Глава 1. Базовые понятия языка
- 1.1. Алфавит, идентификаторы, служебные слова Алфавит
- Идентификатор
- Служебные (ключевые) слова
- 1.2. Константы и строки
- Символы, или символьные константы.
- Целые константы.
- Вещественные константы.
- Предельные значения и типы арифметических констант.
- Целые константы и выбираемые для них типы
- Данные вещественных типов
- Нулевой указатель.
- Строки, или строковые константы.
- 1.3. Переменные и именованные константы Переменная как объект.
- Определение переменных.
- Предельные значения переменных.
- Основные типы данных
- Инициализация переменных.
- Именованные константы.
- 1.4. Операции
- Знаки операций.
- Приоритеты (ранги) операций
- Унарные (одноместные) операции.
- 1.5. Разделители
- Квадратные скобки.
- Круглые скобки.
- Запятая.
- Точка с запятой.
- Двоеточие.
- Многоточие.
- Звездочка.
- Обозначение присваивания.
- Признак препроцессорных средств.
- 1.6. Выражения и приведение арифметических типов
- Отношения и логические выражения.
- Присваивание (выражение и оператор).
- Приведение типов.
- Правила преобразования типов
- Правила стандартных арифметических преобразований
- Выражения с поразрядными операциями.
- Условное выражение.
- Глава 2. Введение в программирование на языке си
- 2.1. Структура и компоненты простой программы
- Текст программы и препроцессор.
- Структура программы.
- Функция форматированного вывода.
- Программы печати предельных констант.
- Применимость вещественных данных.
- Выделение лексем из текста программы.
- 2.2. Элементарные средства программирования Деление операторов языка Си на группы.
- Программа оценки машинного нуля.
- Трассировочная таблица
- Ввод данных.
- Вычисление объема цилиндра.
- Сумма членов ряда Фибоначчи.
- 2.3. Операторы цикла Три формы операторов цикла.
- Приближенное значение экспоненты.
- Оператор break.
- Сумма отрезка степенного ряда.
- Оператор continue.
- Суммирование положительных чисел.
- 2.4. Массивы и вложение операторов цикла Массивы и переменные с индексами.
- Вычисление среднего и дисперсии.
- Упорядочение в одномерных массивах.
- Инициализация массивов.
- 2.5. Функции Определение функций.
- Функция для вычисления объема цилиндра.
- Функция для вычисления скалярного произведения векторов.
- Обращение к функции и ее прототип.
- Вычисление биномиального коэффициента.
- Вычисление объема цилиндра
- Вычисление площади треугольника.
- Скалярное произведение векторов.
- 2.6. Переключатели
- Глава 3. Препроцессорные средства
- 3.1. Стадии и команды препроцессорной обработки
- Стадии препроцессорной обработки.
- Директивы препроцессора.
- 3.2. Замены в тексте Директива #define.
- Цепочка подстановок.
- 3.3. Включение текстов из файлов
- 3.4. Условная компиляция Директивы ветвлений.
- Операция defined.
- 3.5. Макроподстановки средствами препроцессора
- Моделирование многомерных массивов.
- Отличия макросов от функций.
- Препроцессорные операции в строке замещения.
- 3.6. Вспомогательные директивы
- Препроцессорные обозначения строк.
- Реакция на ошибки.
- Пустая директива.
- Прагмы.
- 3.7. Встроенные (заранее определенные) макроимена
- Глава 4. Указатели, массивы, строки
- 4.1. Указатели на объекты Адреса и указатели.
- Операции над указателями.
- Арифметические операции и указатели.
- Указатели и отношения.
- 4.2. Указатели и массивы Указатели и доступ к элементам массивов.
- Массивы динамической памяти.
- Функции для выделения и освобождения памяти
- Массивы указателей и моделирование многомерных массивов.
- "Матрица" со строками разной длины.
- 4.3. Символьная информация и строки
- Ввод-вывод символьных данных.
- Внутренние коды и упорядоченность символов.
- Строки, или строковые константы.
- Строки и указатели.
- Глава 5. Функции
- 5.1. Общие сведения о функциях Определение функции.
- Описание функции и ее тип.
- Вызов функции.
- 5.2. Указатели в параметрах функций Указатель-параметр.
- Имитация подпрограмм.
- 5.3. Массивы и строки как параметры функций Массивы в параметрах.
- Резюме по строкам-параметрам.
- 5.4. Указатели на функции Указатели при вызове функций.
- Указатели на функции как параметры
- Указатель на функцию как возвращаемое функцией значение.
- Библиотечные функции с указателями на функции в параметрах.
- 5.5. Функции с переменным количеством параметров
- Доступ к адресам параметров из списка.
- Макросредства для переменного числа параметров.
- Примеры функций с переменным количеством параметров.
- 5.6. Рекурсивные функции
- 5.7. Классы памяти и организация программ Локализация объектов.
- Глобальные объекты.
- Динамическая память
- Внешние объекты.
- 5.8. Параметры функции main( )
- Глава 6. Структуры и объединения
- 6.1. Структурные типы и структуры Производные типы.
- Структурный тип.
- Определение структур.
- Выделение памяти для структур.
- Инициализация и присваивание структур.
- Доступ к элементам структур.
- 6.2. Структуры, массивы и указатели Массивы и структуры в качестве элементов структур.
- Массивы структур.
- Указатели на структуры.
- Указатели как средство доступа к компонентам структур.
- Указатели на структуры как компоненты структур.
- 6.3. Структуры и функции
- Имитация абстрактных типов данных.
- 6.4. Динамические информационные структуры Статическое и динамическое представление данных.
- Односвязный список.
- Рекурсия при обработке списка.
- 6.5. Объединения и битовые поля Объединения.
- Битовые поля.
- Глава 7. Ввод и вывод
- 7.1. Потоковый ввод-вывод
- 7.1.1. Открытие и закрытие потока
- 7.1.2. Стандартные файлы и функции для работы с ними
- Ввод-вывод отдельных символов.
- Ввод-вывод строк.
- Форматный ввод-вывод.
- Спецификаторы форматной строки для функции форматного вывода
- Спецификаторы форматной строки для функции форматного ввода
- 7.1.3. Работа с файлами на диске
- Двоичный (бинарный) режим обмена с файлами.
- Строковый обмен с файлами.
- Позиционирование в потоке.
- Трехъязычный словарь "Цифры
- 7.2. Ввод-вывод нижнего уровня
- 7.2.1. Открытие / закрытие файла
- 7.2.2. Чтение и запись данных
- 7.2.3. Произвольный доступ к файлу
- Глава 8. Примеры разработки программ
- 8.1. Программа с объектами разных классов памяти Постановка задачи.
- Программная реализация.
- 8.2. Структуры и обработка списков в основной памяти Постановка задачи.
- Функция main( ).
- Функция init( ) - "Инициализировать базу данных".
- Функция delete() - "Удалить все сведения о сотруднике из базы данных".
- Функция fr( ) - "Возвратить освобожденный элемент в список свободных элементов".
- Функция input( ) - "Ввести в базу данных сведения о новом сотруднике".
- Функция print( ) - "Печать списка занятых элементов".
- Сохранение (восстановление) базы данных.
- 8.3. Сортировка на основе бинарного дерева Статические и динамические данные.
- Управление динамической памятью.
- Сортировка с помощью бинарного дерева.
- Печать результатов сортировки.
- Раздел 2. Выполнение программ в разных операционных системах Глава 9. Подготовка и выполнение программ
- 9.1. Подготовка программ в операционной системе unix
- 9.1.1. Команда make
- Формат файла описаний зависимостей модулей.
- Формат команды make.
- Макроопределения.
- Встроенные правила.
- 9.1.2. Библиотеки объектных модулей
- Стандартные библиотеки.
- Создание и сопровождение собственных библиотек.
- 9.2. Сборка и выполнение программ в интегрированной среде Turbo с 2.0
- 9.2.1. Состав системы программирования Turbo с 2.0
- 9.2.2. Экран интегрированной среды Turbo с 2.0
- 9.2.3. Система меню среды Turbo с 2.0
- 9.2.4. Настройка среды Turbo с
- Создание рабочего каталога.
- Установка в среде Turbo с 2.0 полных имен каталогов.
- Настройка параметров управления проектом.
- 9.5. Окно определения проекта
- Сборка и выполнение программы.
- 1. Команды управления курсором:
- 2. Команды вставки и удаления:
- 3. Команды обработки блоков текста:
- 4. Дополнительные команды:
- 9.3.2. Экран интегрированной среды
- 9.3.3. Система меню интегрированной среды
- Задание полных имен основных и рабочего каталогов.
- Выбор стандарта языка Си.
- Установка параметров подсистемы Make.
- Создание проекта.
- Задание аргументов командной строки.
- Сохранение параметров настройки интегрированной среды.
- Сборка и выполнение программы.
- Работа в интегрированной среде в последующих сеансах.
- Раздел 3. Практикум по программированию на языке Си Глава 10. Задачи по программированию
- 10.1. Ознакомительная работа
- 10.2. Итерационные методы и ряды
- Варианты заданий по итерационным методам и рядам
- 10.3. Работа со строками. Указатели, динамические одномерные массивы
- 10..1. Варианты задач по обработке строк*
- 10.3.2. Рекомендации по обработке строк
- 10.3.3. Пример выполнения задания по обработке строк
- 10.4. Многомерные динамические массивы с переменными размерами
- 10.4.1. Варианты задач для 1-й части задания по многомерным массивам (правила формирования многомерного массива)
- 10.4.2. Варианты для 2-й части задания по многомерным массивам
- 10.4.3. Пример выполнения задания по многомерным динамическим массивам
- 10.5. Функции и указатели
- 10.6. Функции и массивы
- 10.7. Работа со структурами
- 10.7.1. Варианты структур для выполнения работы
- 10.8. Списки и деревья
- 10.8.1. Списки
- 10.8.2. Деревья
- Приложение 1. Таблицы кодов ascii
- Коды управляющих символов (0 31)
- Символы с кодами 32 127
- Символы с кодами 128 255 (Кодовая таблица 866 - ms-dos)
- Символы с кодами 128 255 (Кодовая таблица 1251 - ms Windows)
- Приложение 2. Константы предельных значений
- Приложение 3. Стандартная библиотека функций языка Си
- Функции для работы с терминалом в текстовом режиме (файл conio.H)
- Специальные функции
- Литература
- Содержание
- Раздел 1. Полный курс программирования на стандартном языке Си 4
- Глава 1. Базовые понятия языка 4
- Глава 2. Введение в программирование на языке си 33
- Глава 3. Препроцессорные средства 73
- Глава 4. Указатели, массивы, строки 91
- Глава 5. Функции 114
- Глава 6. Структуры и объединения 155
- Глава 7. Ввод и вывод 186
- Глава 8. Примеры разработки программ 218
- Раздел 2. Выполнение программ в разных операционных системах 256
- Глава 9. Подготовка и выполнение программ 256
- Раздел 3. Практикум по программированию на языке Си 282
- Глава 10. Задачи по программированию 282
- Подбельский Вадим Валерьевич Фомин Сергей Сергеевич программирование на языке си
- 101000, Москва, ул. Покровка, 7 Телефон (095) 925-35-02, факс (095) 925-09-57