Таблица 4.5. Флаги функции printf <)

Символьные строки и форматированный ввод-вывод 135
Примеры использования модификаторов и флагов
Давайте посмотрим на описанные выше модификаторы в действии. Мы начнем с оценки влияния модификатора, устанавливающего ширину поля, на вывод целого числа. Рассмотрим программу, показанную в листинге 4.7.
Листинг 4.7. Программа width.с

Программа из листинга 4.7 выводит одно и то же число четыре раза, применяя четыре разных спецификатора преобразования. Звездочка (*) служит для обозначения начала и конца каждого поля. Вывод выглядит следующим образом:
*959*
*959*
* 959*
*959 *
Первым спецификатором преобразования является %d без модификаторов. Он производит поле с шириной, которую имеет выводимое целое число. Этот вариант принят но умолчанию, т.е. если не предоставлены дальнейшие инструкции, то число будет выведено именно в таком виде. Второй спецификатор преобразования — %2d. Он устанавливает ширину поля равной 2, но поскольку в рассматриваемом примере целое число имеет три значащих цифры, ноле автоматически расширяется, чтобы уместить это число. Следующий спецификатор преобразования — %10d. Он генерирует поле шириной 10 символов, при этом в итоге получаются семь пробелов и три цифры между звездочками, а число смещено к правой границе поля. Последним спецификатором является %-10d. Он также производит ноле шириной 10 символов, а знак - означает, что число начинается с левого края, как и было заявлено. Привыкнув к этой системе, вы убедитесь, что она проста в применении и обеспечивает высокий контроль над внешним видом вывода. Попробуйте изменить значение PAGES, чтобы посмотреть, как выводятся числа с различным количеством цифр.
Теперь рассмотрим форматы чисел с плавающей запятой. Введите, скомпилируйте и запустите программу, показанную в листинге 4.8.
Листинг 4.8. Программа floats.с

136 Глава 4

На этот раз для создания символической константы в программе используется ключевое слово const. Вывод имеет следующий вид:
*3852.990000*
*3.852990е+03*
*3852.99*
*3853.0*
* 3852.990*
* 3.853Е+03*
*+3852.99*
*0003852.99*
Пример начинается с версии, применяемой по умолчанию — %f. В этом случае задействованы два стандартных параметра: ширина поля и количество цифр справа от десятичной точки. Количество цифр по умолчанию равно шести, а ширина поля должна быть такой, чтобы уместить число.
Затем используется еще одна версия спецификатора, принятая по умолчанию — %е. Она выводит одну цифру слева от десятичной точки и резервирует шесть позиций справа от нее. Получается довольно много цифр. Чтобы исправить это положение, нужно указать количество десятичных позиций справа от десятичной точки, и следующие четыре примера служат иллюстрацией такого решения. Обратите внимание на то, что в четвертом и шестом примере при выводе происходит округление. Вдобавок в шестом примере вместо спецификатора е применяется Е.
Наконец, флаг + приводит к выводу результата с его алгебраическим знаком, которым в данном случае является “плюс”, а флаг 0 обеспечивает дополнение до полной ширины поля ведущими нулями. Следует отметить, что в спецификаторе %010.2 f первый 0 — это флаг, а остальные цифры до десятичной точки (10) указывают ширину ноля.
Можете модифицировать значение RENT, чтобы посмотреть, как выводятся значения разнообразной длины. Программа в листинге 4.9 демонстрирует еще несколько возможных комбинаций.
Листинг 4.9. Программа flags.с

Символьные строки и форматированный ввод-вывод 137
Вывод программы показан ниже:
If IF 0xlf
42** —42**
** 6** 006**00006** 006**
Первым делом отметим, что If — это шестнадцатеричный эквивалент десятичного числа 31. Спецификатор х выдает результат If, а спецификатор X — 1F. Использование флага # обеспечивает вывод ведущих символов 0x.
Вторая строка вывода иллюстрирует, что применение пробела в спецификаторе приводит к появлению ведущего пробела для положительных, но не для отрицательных значений. Это позволяет получать симпатичный вывод, т.к. положительные и отрицательные значения с одинаковым количеством значащих цифр выводятся в полях одинаковой ширины.
Читать дальше