netlib.narod.ru< Назад | Оглавление | Далее >

7.2. Форматный вывод (printf)

Функция printf переводит внутренние значения в текст.

  int printf(char *format, arg1, arg2, ...)

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

Функция printf преобразует, форматирует и печатает свои аргументы в стандартном выводе под управлением формата. Возвращает она количество напечатанных символов.

Форматная строка содержит два вида объектов: обычные символы, которые напрямую копируются в выходной поток, и спецификации преобразования, каждая из которых вызывает преобразование и печать очередного аргумента printf. Любая спецификация преобразования начинается знаком % и заканчивается символом-спецификатором. Между % и символом-спецификатором могут быть расположены (в указанном ниже порядке) следующие элементы:

Символы-спецификаторы перечислены в таблице 7.1. Если за % не помещен символ-спецификатор, поведение функции printf будет не определено.


Таблица 7.1. Основные преобразования printf


Символ Тип аргумента; вид печати
d, i int; десятичное целое
o int; беззнаковое восьмеричное (octal) целое (без нуля слева)
x, X unsigned int; беззнаковое шестнадцатиричное целое (без 0x или 0X слева), для шестнадцатиричных цифр от 10 до 15 используются символы a, b, c, d, e, f или A, B, C, D, E, F
u int; беззнаковое десятичное целое
c int; одиночный символ
s char *; печатает символы, пока не встретится символ \0, или количество символов, заданное точностью
f double; [-] m.dddddd, где количество цифр d задается точностью (по умолчанию равно 6)
e, E double; [-] m.dddddde+xx или [-] m.ddddddE+xx, где количество цифр d задается точностью (по умолчанию равно 6)
g, G double; использует %e или %E, если порядок меньше, чем -4, или больше или равен точности; в противном случае использует %f. Завершающие нули и завершающая десятичная точка не печатаются
p void *; указатель (представление зависит от реализации)
% Аргумент не преобразуется; печатается знак %

Ширину и точность можно задавать с помощью знака *; значение ширины (или точности) в этом случае берется из следующего аргумента, который должен быть типа int. Например, чтобы напечатать не более max символов из строки s, годится следующая запись:

  printf("%.*s", max, s);

Большая часть форматных преобразований была продемонстрирована в предыдущих главах. Исключение составляет задание точности для строк. Далее приводится перечень спецификаций и показывается их влияние на печать строки «hello, world», состоящей из 12 символов. Поле специально обрамлено двоеточиями, чтобы была видна его протяженность.

    %s            :hello, world:
    %10s          :hello, world:
    %.10s         :hello, wor:
    %-10s         :hello, world:
    %.15s         :hello, world:
    %-15s         :hello, world   :
    %15.10s       :     hello, wor:
    %-15.10s      :hello, wor     :

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

  printf(s);        /* НЕВЕРНО, если в s есть % */
  printf("%s", s);  /* ВЕРНО всегда */

Функция sprintf выполняет те же преобразования, что и printf, но вывод запоминается в строке

  int sprintf(char *string, char *format, arg1, arg2, ...)

Эта функция форматирует аргументы arg1, arg2 и т.д. в соответствии с информацией, заданной аргументом format, как мы описывали ранее, но результат помещает не в стандартный вывод, а в string. Заметим, что строка string должна быть достаточно большой, чтобы в ней поместился результат.


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


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



netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz