Функція виводу, printf, обертає внутрішні значення на друковні знаки. Ми неформально застосовували printf у попередніх розділах. Опис, який ви знайдете тут, охоплює найтиповіші випадки використання функції, але не є повним; для всіх подробиць зверніться до Додатка Б.
int printf(char *format, arg1, arg2, ...);
printf перетворює, форматує і виводить свої аргументи на стандартний пристрій виводу згідно із форматом (format). Вона повертає кількість виведених символів.
Ланцюжок формату містить два типи об'єктів: звичайні символи, які буде копійовано до вивідного потоку і вказівники перетворення, кожен з яких призводить до, власне, перетворення і виводу кожного наступного аргументу printf. Кожний вказівник перетворення починається з %і закінчується знаком перетворення. Між % і цим знаком можуть також знаходитись, в даній послідовності:
- Знак мінуса, що вказує вирівнювання з лівого боку перетвореного аргументу.
- Число, яке вказує мінімальну ширину поля. Перетворений аргумент буде виведено у полі, щонайменше, цієї ширини. Якщо треба, то простір буде заповнено ліворуч (або праворуч, якщо вказано вирівнювання зліва) для того, щоб добитися потрібної ширини поля.
- Крапка, яка відокремлює ширину поля від вказівника точності.
- Число точності, яке вказує максимальну кількість знаків, що буде виведено з ланцюжка, або кількість цифр після десяткової крапки у випадку числа з рухомою точкою, або мінімальну кількість цифр цілого числа.
- Знак h, якщо ціле буде виведене як коротке (short), або l (англійська літера «л»), якщо як довге (long).
Символи перетворення показано в Таблиці 7.1. Якщо знак після % не являється вказівником перетворення, поводження залишеться невизначеним.
Таблиця 7.1 Основні перетворення printf
|
Знак
| Тип аргументу
| Виводиться як
|
d, i
| int
| десяткове число.
|
o
| int
| беззнакове вісімкове число (без нуля попереду).
|
x, X
| int
| беззнакове шістнадцяткове число (без 0x або 0X попереду), використовуючи abcdef або ABCDEF замість 10, ..., 15.
|
u
| int
| беззнакове ціле число.
|
c
| int
| один знак.
|
s
| char *
| виводить знаки ланцюжка до '\0' або тієї кількості знаків, яку задано вказівником точності.
|
f
| double
| [-]m.dddddd, де кількість d задано вказівником точності (за замовчуванням - 6).
|
е, Е
| 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, ...);
sprintf форматує аргументи arg1, arg2 і так далі, відповідно до формату (format), як і раніше, але результат в ланцюжку (string) замість стандартного виводу; string повинен бути досить великим, щоб втримати результат.
Вправа 7-1. Напишіть програму, яка виводитиме довільний текст вводу у розумний спосіб. Як мінімум, вона повинна відображати неграфічні знаки як вісімкові або шістнадцяткові числа, в залежності від вашого бажання, окрім цього розбивати довгі рядки тексту.