Спецификаторы форматной строки для функции форматного вывода
Спецификатор | Тип аргумента
| Формат вывода
| |
d | int, char, | Десятичное целое со знаком | |
| unsigned |
| |
i | int, char, | Десятичное целое со знаком | |
| unsigned |
| |
u | int, char, | Десятичное целое без знака | |
| unsigned |
| |
0 | int, char, | Восьмеричное целое без знака | |
| unsigned |
| |
x | int, char, | Шестнадцатеричное целое без знака; при выводе ис- | |
| unsigned | пользуются символы "0...9a...f | |
X | int, char, | Шестнадцатеричное целое без знака; при выводе ис- | |
| unsigned | пользуются символы "0...9A...F | |
f | double, | Вещественное значение со знаком в виде: | |
| float | знак _числаdudd.dddd, | |
|
| где dddd - одна или более десятичных цифр. Количество цифр перед десятичной точкой зависит от величины выводимого числа, а количество цифр после десятичной точки зависит от требуемой точности. Знак числа при отсутствии модификатора '+' изображается только для отрицательного числа | |
|
| ||
|
| ||
|
| ||
|
| ||
е | double, float | Вещественное значение в виде: знак числаm.ddddeзнакxxx, где m.dddd - изображение мантиссы числа; m - одна десятичная цифра; dddd - последовательность десятичных цифр; е - признак порядка; знак - знак порядка; ххх - десятичные цифры для представления порядка числа; знак числа при отсутствии модификатора '+' изображается только для отрицательного числа | |
Е | double, float | Идентичен спецификатору "е", за исключением того, что признаком порядка служит "Е" | |
g | double, float | Вещественное значение со знаком печатается в формате спецификаторов "f'' или "е" в зависимости от того, какой из них более компактен для данного значения и точности. Формат спецификатора "е" используется тогда, когда значение показателя меньше -4 или больше заданной точности. Конечные нули отбрасываются, а десятичная точка появляется, если за ней следует хотя бы одна цифра | |
G | double, float | Идентичен формату спецификатора "g", за исключением того, что признаком порядка служит "Е" | |
с | int, char, unsigned | Одиночный символ | |
S | char * | Символьная строка. Символы печатаются либо до первого нулевого символа ('\0') или печатается то количество символов, которое задано в поле точность спецификации преобразования | |
р | void * | Значение адреса. Печатает адрес, указанный аргументом (представление адреса зависит от реализации) |
Приведем примеры использования различных спецификаторов. В каждой строке вызова функции printf( ) в качестве комментариев приведены результаты вывода. Переменная code содержит код возврата функции printf( ) - число напечатанных символов при выводе значения переменной f.
}
Необязательные элементы спецификации преобразования управляют другими параметрами форматирования.
Флаги управляют выравниванием вывода и печатью знака числа, пробелов, десятичной точки, префиксов восьмеричной и шестнадцатеричной систем счисления. Флаги могут отсутствовать, а если они есть, то могут стоять в любом порядке. Смысл флагов следующий:
- Выводимое изображение значения прижимается к левому краю поля. По умолчанию, т.е. при отсутствии этого флага, происходит выравнивание по правой границе поля.
+ Если выводимое значение имеет знак (любой: '+' или '-'), то он выводится. Без этого флага знак выводится только при отрицательном значении.
пробел Используется для вставки пробела на месте знака перед положительными числами.
# Если этот флаг используется с форматами "о", "х" или "X", то любое ненулевое значение выводится с предшествующим 0, 0х или 0Х соответственно. При использовании флага # с форматами "f', "g", "G" десятичная точка будет выводиться, даже если в числе нет дробной части.
Примеры использования флагов:
"%+d" - вывод знака '+' перед положительным целым десятичным числом;
"% d" - добавление (вставка) пробела на месте знака перед положительным числом (использован флаг пробел после символа %);
"%#о" - печать ведущих нулей в изображениях восьмеричных чисел.
Ширина_поля, задаваемая в спецификации преобразования положительным целым числом, определяет минимальное количество позиций, отводимое для представления выводимого значения. Если число символов в выводимом значении меньше, чем ширина_поля, выводимое значение дополняется пробелами до заданной минимальной длины. Если ширина_поля задана с начальным нулем, не занятые значащими цифрами выводимого значения позиции слева заполняются нулями.
Если число символов в изображении выводимого значения больше, чем определено в ширине_поля, или ширина_поля не задана, печатаются все символы выводимого значения.
Точность указывается с помощью точки и необязательной последовательности десятичных цифр (отсутствие цифр эквивалентно 0).
Точность задает:
• минимальное число цифр, которые могут быть выведены при использовании спецификаторов d, i, о, u, х или X;
• число цифр, которые будут выведены после десятичной точки при спецификаторах е, Е и f;
• максимальное число значащих цифр при спецификаторах g и G;
• максимальное число символов, которые будут выведены при спецификаторе s.
Непосредственно за точностью может быть указан модификатор, который определяет тип ожидаемого аргумента и задается следующими символами:
h - указывает, что следующий после h спецификатор d, i, о, х или X применяется к аргументу типа short или unsigned short;
l - указывает, что следующий после l спецификатор d, i, о, х или X применяется к аргументу типа long или unsigned long;
L - указывает, что следующий после L спецификатор е, Е, f, g или G применяется к аргументу типа long double.
Примеры указания ширины_поля и точности:
%d - вывод десятичного целого в поле, достаточном для представления всех его цифр и знака;
%7d - вывод десятичного целого в поле из 7 позиций;
%f - вывод вещественного числа с целой и дробной частями (выравнивание по правому краю; количество цифр в дробной части определяется реализацией и обычно равно 6);
%7f - вывод вещественного числа в поле из 7 позиций;
%.3f - вывод вещественного числа с тремя цифрами после десятичной точки;
%7.3f - вывод вещественного числа в поле из 7 позиций и тремя цифрами после десятичной точки;
%.0f - вывод вещественного числа без десятичной точки и без дробной части;
%15s - печать в выводимой строке не менее 15 символов;
%.12s - печать строки длиной не более 12 символов ("лишние" символы не выводятся);
%12.12 - печать всегда в поле из 12 позиций, причем лишние символы не выводятся, используется всегда 12 позиций. Таким образом, точное количество выводимых символов можно контролировать, задавая и ширину_поля, и точность (максимальное количество символов); %-15s - выравнивание выводимой строки по левому краю;
%08f - вывод вещественного числа в поле из 8 позиций. Не занятые значащими цифрами позиции заполняются нулями.
Функция форматного вывода printf( ) предоставляет множество возможностей по форматированию выводимых данных, однако наибольший интерес представляют построение столбцов данных и их выравнивание по левому или правому краю заданного поля.
В программе, приводимой ниже, на экран дисплея выводится список товаров в магазине. В каждой строке в отдельных полях указываются: номер товара (int), код товара (int), наименование товара (строка символов) и цена товара (float).
Результат выполнения программы:
Форматная строка в параметрах функции printf( ) обеспечивает следующие преобразования выводимых значений:
1) переменная number[i] типа int выводится в поле шириной 3 символа и прижимается к левому краю (%-3d);
2) переменная code[i] типа int выводится в поле шириной 5 символов и прижимается (по умолчанию) к правому краю (%5d);
3) строка из массива design[i] выводится в поле шириной 20 символов и прижимается к левому краю (%-20s). Если в данной спецификации преобразования будет указано меньшее, чем 20, количество позиций, то самая длинная строка будет все равно выведена, однако последний столбец не будет выровнен;
4) переменная price[i] типа float выводится в поле шириной 8 символов, причем после десятичной точки выводятся 3 символа, и выводимое значение прижимается к правому краю.
Между полями, определенными спецификациями преобразований, выводится столько пробелов, сколько их явно задано в форматной строке между спецификациями преобразования. Таким образом, добавляя пробелы между спецификациями преобразования, можно производить форматирование всей выводимой таблицы.
Напомним, что любые символы, которые появляются в форматной строке и не входят в спецификации преобразования, копируются в выходной поток. Этим обстоятельством можно воспользоваться для вывода явных разделителей между столбцами таблицы. Например, для этой цели можно использовать символ '*' или '|'. В последнем случае форматная строка в функции printf( ) будет выглядеть так: "%-3d | %5d | %-20s | %8.3f/n", и результат работы программы будет таким:
Форматный ввод из входного потока. Форматный ввод из входного потока осуществляется функцией scanf( ). Прототип функции scanf( ) имеет вид:
int scanf(const char * format,. ..);
При обращении к функции scanf( ) возможны две формы задания первого параметра:
int scanf ( форматная_строка, список_аргументов );
int scanf ( указатель_на_форматную_строку, список_аргументов);
Функция scanf( ) читает последовательности кодов символов (байты) из входного потока и интерпретирует их в соответствии с форматной_строкой как целые числа, вещественные числа, одиночные символы, строки. В первом варианте вызова функции форматная строка размещается непосредственно в списке фактических параметров. Во втором варианте вызова предполагается, что первый фактический параметр - это указатель типа char *, адресующий собственно форматную строку. Форматная строка в этом случае должна быть определена в программе как обычная строковая константа или переменная.
После преобразования во внутреннее представление данные записываются в области памяти, определенные аргументами, которые следуют за форматной строкой. Каждый аргумент должен быть указателем на переменную, в которую будет записано очередное значение данных и тип которой соответствует типу, указанному в спецификации преобразования из форматной строки.
Если аргументов недостаточно для данной форматной строки, то результат зависит от реализации (от операционной системы и от системы программирования). Если аргументов больше, чем требуется в форматной строке, "лишние" аргументы игнорируются.
Последовательность кодов символов, которую функция scanf( ) читает, из входного потока, как правило, состоит из полей (строк), разделенных символами промежутка или обобщенными пробельными символами. Поля просматриваются и вводятся функцией scanf( ) посимвольно. Ввод поля прекращается, если встретился пробельный символ или в спецификации преобразования точно указано количество вводимых символов (см. ниже).
Функция scanf( ) завершает работу, если исчерпана форматная строка. При успешном завершении scanf( ) возвращает количество преобразованных и введенных полей (точнее, количество объектов, получивших значения при вводе). Значение EOF возвращается при возникновении ситуации "конец файла"; значение -1 - при возникновении ошибки преобразования данных.
Форматная строка ограничена двойными кавычками и может включать:
• пробельные символы, отслеживающие разделение входного потока на поля. Пробельный символ указывает на то, что из входного потока надо считывать, но не сохранять все последовательные пробельные символы вплоть до появления непробельного символа. Один пробельный символ в форматной строке соответствует любому количеству последовательных пробельных символов во входном потоке;
• обычные символы, отличные от пробельных и символа '%'. Обработка обычного символа из форматной строки сводится к чтению очередного символа из входного потока. Если прочитанный символ отличается от обрабатываемого символа форматной строки, функция завершается с ошибкой. Несовпавший символ и следующие за ним входные символы остаются непрочитанными;
• спецификации преобразования.
Спецификация преобразования имеет следующую форму:
% * ширина_поля модификатор спецификатор
Все символы в спецификации преобразования являются необязательными, за исключением символа '%', с которого она начинается (он и является признаком спецификации преобразования), и спецификатора, позволяющего указать ожидаемый тип элемента во входном потоке (табл. 7.2).
Таблица 7.2
- Предисловие
- Раздел 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