Опубликован: 05.07.2006 | Уровень: для всех | Доступ: платный
Лекция 8:

Ввод и вывод

< Лекция 7 || Лекция 8: 123456 || Лекция 9 >

7.3. Форматный вывод - функция printf

Две функции: printf для вывода и scanf для ввода (следующий раздел) позволяют преобразовывать численные величины в символьное представление и обратно. Они также позволяют генерировать и интерпретировать форматные строки. Мы уже всюду в предыдущих лекциях неформально использовали функцию printf ; здесь приводится более полное и точное описание. функция

printf(control, arg1, arg2, ...)

преобразует, определяет формат и печатает свои аргументы в стандартный вывод под управлением строки control. Управляющая строка содержит два типа объектов: обычные символы, которые просто копируются в выходной поток, и спецификации преобразований, каждая из которых вызывает преобразование и печать очередного аргумента printf.

Каждая Спецификация преобразования начинается с символа % и заканчивается символом преобразования. Между % и символом преобразования могут находиться:

  • знак минус, который указывает о выравнивании преобразованного аргумента по левому краю его поля.
  • Строка цифр, задающая минимальную ширину поля. Преобразованное число будет напечатано в поле по крайней мере этой ширины, а если необходимо, то и в более широком. Если преобразованный аргумент имеет меньше символов, чем указанная ширина поля, то он будет дополнен слева (или справа, если было указано выравнивание по левому краю)заполняющими символами до этой ширины. Заполняющим символом обычно является пробел, а если ширина поля указывается с лидирующим нулем, то этим символом будет нуль (лидирующий нуль в данном случае не означает восьмеричной ширины поля).
  • Точка, которая отделяет ширину поля от следующей строки цифр.
  • Строка цифр (точность), которая указывает максимальное число символов строки, которые должны быть напечатаны, или число печатаемых справа от десятичной точки цифр для переменных типа float или double.
  • Модификатор длины l, который указывает, что соответствующий элемент данных имеет тип long, а не int.

Ниже приводятся символы преобразования и их смысл:

  • d - аргумент преобразуется к десятичному виду.
  • o - аргумент преобразуется в беззнаковую восьмеричную форму (без лидирующего нуля).
  • x - аргумент преобразуется в беззнаковую шестнадцатеричную форму (без лидирующих 0x ).
  • u - аргумент преобразуется в беззнаковую десятичную форму.
  • c - аргумент рассматривается как отдельный символ.
  • s - аргумент является строкой: символы строки печатаются до тех пор, пока не будет достигнут нулевой символ или не будет напечатано количество символов, указанное в спецификации точности.
  • e - аргумент, рассматриваемый как переменная типа float или double, преобразуется в десятичную форму в виде [-]m.nnnnnne[+-]xx, где длина строки из n определяется указанной точностью. Точность по умолчанию равна 6.
  • f - аргумент, рассматриваемый как переменная типа float или double, преобразуется в десятичную форму в виде [-]mmm.nnnnn, где длина строки из n определяется указанной точностью. Точность по умолчанию равна 6. Отметим, что эта точность не определяет количество печатаемых в формате f значащих цифр.
  • g - Используется или формат %e или %f, какой короче; незначащие нули не печатаются. Если идущий за % символ не является символом преобразования, то печатается сам этот символ; следовательно, символ % можно напечатать, указав %%.

Большинство из форматных преобразований очевидно и было проиллюстрировано в предыдущих лекциях. Единственным исключением является то, как точность взаимодействует со строками. Следующая таблица демонстрирует влияние задания различных спецификаций на печать " hello, world " (12 символов). Мы поместили двоеточия вокруг каждого поля для того, чтобы вы могли видеть его протяженность.

:%10s:          :hello, world:
:%10-s:         :hello, world:
:%20s:          :    hello, world:
:%-20s:         :hello, world      :
:%20.10s:       :      hello, wor:
:%-20.10s:      :hello, wor      :
:%.10s:         :hello, wor:

Предостережение: printf использует свой первый аргумент для определения числа последующих аргументов и их типов. Если количество аргументов окажется недостаточным или они будут иметь несоответственные типы, то возникнет путаница и вы получите бессмысленные результаты.

Упражнение 7-1

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

< Лекция 7 || Лекция 8: 123456 || Лекция 9 >
Ярослав Воробей
Ярослав Воробей
Россия
Дмитрий Левин
Дмитрий Левин
Россия