Printf

Діаграма, що ілюструє синтаксис функції printf. Першим аргументом функції є шаблонний рядок, який може містити специфікатори формату, що позначаються символом відсотка (%). Специфікатори формату вказують функції printf, як інтерпретувати та виводити значення, задані у відповідних аргументах, що йдуть за рядком формату. printf замінює специфікатори формату відповідно інтерпретованим вмістом решти аргументів і виводить результат.
Приклад виклику функції printf

printf — це функція зі стандартної бібліотеки C, а також команда терміналу (оболонки) Linux, яка форматує текст і записує його на стандартний вивід[1]. Вона приймає форматний рядок і змінну кількість аргументів, які серіалізує згідно з цим рядком[2]; Невідповідність між специфікаторами формату з форматного рядка та типами/кількістю аргументів призводить до невизначеної поведінки і потенційно до аварійного завершення програми або вразливостей.

Форматний рядок — це шаблонна мова, що містить звичайний текст і специфікатори формату, кожен з яких визначає, як перетворити значення на текст. Обробка форматного рядку відбувається зліва направо, і кожному знайденому специфікатору відповідає наступне значення зі списку аргументів. Специфікатори починаються з символу % і містять символи, що визначають тип даних (наприклад, ціле число чи рядок).

Стандартна бібліотека містить родину printf-подібних функцій, які мають однакові можливості форматування, але відрізняються призначенням (наприклад, виведення у файл) або рівнем безпеки. Синтаксис і семантика цих функцій були запозичені багатьма іншими мовами програмування. Приклади таких функцій: vprintf (вивід у консоль через va_list), fprintf (вивід у файл або потік), vfprintf (вивід у файл або потік через va_list), sprintf (запис у рядок), snprintf (безпечний запис у рядок з лімітом розміру), vsprintf (запис у рядок через va_list), vsnprintf (безпечний запис у рядок з лімітом через va_list).

Функція scanf стандартної бібліотеки C доповнює printf, надаючи форматований ввід(також званий лексингом або парсингом) через подібний синтаксис рядка форматування.

Назва printf — це скорочення від print formatted («форматований вивід»). Історично print означало вивід на принтер, але сьогодні це будь-яке текстове середовище: термінал, файл тощо.

Специфікатор формату

Форматування значень задається специфікаторами у форматному рядку. Наприклад цей код виводить текст «Your age is» і значення змінної age в десятковому форматі:

printf("Your age is %d", age);

Синтаксис

Синтаксис специфікатора формату такий:

%[ параметр ][ прапори ][ ширина ][ .точність ][ довжина ] тип

Поле параметра (parameter)

Поле параметра необов'язкове. Якщо воно включене, зіставлення специфікаторів зі значеннями відбувається не послідовно. Числове значення n вибирає n-й параметр значення. Це розширення POSIX, а не C99.

Текст Опис
n$ n — це індекс параметра значення для серіалізації з використанням цього специфікатора формату

Це поле дозволяє використовувати одне й те саме значення кілька разів у рядку форматування, замість того, щоб передавати його кілька разів. Якщо специфікатор містить це поле, то наступні специфікатори також повинні його використовувати.

Наприклад,

printf("%2$d %2$#x; %1$d %1$#x",16,17);

виведе: 17 0x11; 16 0x10

Це поле дуже корисне для локалізації повідомлень різними природними мовами, які використовують різний порядок слів.

У Windows API підтримка цієї можливості здійснюється через іншу функцію, printf_p.

Поле прапорів (flags)

Може містити нуль або більше символів у будь‑якому порядку:

Текст Опис
- Вирівнювання виводу цього заповнювача по лівому краю; за замовчуванням вирівнювання виводу по правому краю
+ Додає знак плюс для додатного значення; за замовчуванням додатне значення не має префікса

(пробіл)
Додає пробіл перед додатним значенням; ігнорується, якщо прапорець + було вжито; за замовчуванням додатне значення не має префікса
0 Якщо вказано опцію 'width', для числових типів замість пробілів додаються нулі; наприклад, printf("%4X",3) повертає « 3», тоді як printf("%04X",3); повертає «0003»
' До цілого числа або степеня десяткового числа застосовується роздільник групування тисяч
# Альтернативна форма:

для типів g і G кінцеві нулі не видаляються; для типів f, F, e, E, g, G вивід завжди містить десяткову крапку; для типів o, x, X текст 0, 0x, 0X відповідно додається до ненульових чисел

Поле ширини (width)

Поле width визначає мінімальну кількість символів для виводу. Якщо значення може бути представлене меншою кількістю символів, то значення доповнюється пробілами зліва, щоб вивід складав вказану кількість символів. Якщо значення вимагає більше символів, вивід буде довшим за вказану ширину. Значення ніколи не усікається.

Наприклад, printf("%3d", 12); визначає ширину 3 і виводить 12 (з пробілом зліва). Виклик printf("%3d", 1234); виведе 1234 (4 символи), оскільки це мінімальна ширина для цього значення.

Якщо поле ширини пропущено, результатом буде мінімальна кількість символів для значення.

Поле ширини можна використовувати для форматування значень у вигляді таблиці (табульований вивід). Але стовпці не вирівнюються, якщо будь-яке значення більше, ніж поміщається у вказану ширину. Наприклад, зверніть увагу, що значення останнього рядка (1234) не поміщається у перший стовпець шириною 3, і тому стовпець не вирівнюється.

  1   1
 12  12
123 123
1234 123

Поле точності (precision)

Поле precision зазвичай визначає максимальне обмеження виводу. Для типів з рухомою комою воно визначає кількість цифр праворуч від десяткової крапки, до якої слід округлити вивід. Для типів %g та %G воно визначає загальну кількість значущих цифр. Для типу рядка воно обмежує кількість символів, які слід вивести, після чого рядок усікається.

Точність може бути відсутня, задаватися явно числом або динамічно через *, наприклад:

printf("%.*s", 3, "abcdef");

надрукує abc.

Поле довжини (length)

Поле довжини може бути пропущене або бути одним із таких:

Текст Опис
hh Для цілих типів: очікується аргумент типу char, розширений до int.
h Для цілих типів: очікується аргумент типу short, розширений до int.
l Для цілих типів: очікується аргумент типу long.

Для типів з рухомою комою ігнорується.

ll Для цілих типів: очікується аргумент типу long long.
L Для типів з плаваючою точкою: очікується аргумент типу long double.
z Для цілих типів: очікується аргумент типу size_t.
j Для цілих типів: очікується аргумент типу intmax_t.
t Для цілих типів: очікується аргумент типу ptrdiff_t.

Також існують специфічні для платформи опції довжини (наприклад, I, I32, I64 у Win32/Win64, q у BSD).

Стандарт ISO C99 містить заголовковий файл inttypes.h, який містить низку макросів форматування цілих чисел незалежно від платформи (наприклад, PRId64 для 64-бітних цілих чисел).

Поле типу (type)

Поле типу може бути будь-яким з:

Текст Опис
% Виводить знак %, не приймає інші поля.
d,i знаковий int у десятковому форматі (різниця тільки в scanf).
u беззнаковий int у десятковому
f, F double у фіксованому форматі з десятковою крапкою; різниця тільки в регістрі написання inf/nan.
e, E double, форматований у науковій нотації
g, G double, форматований як %e або %f (який коротший)
x, X беззнаковий int у шістнадцятковому форматі (малі/великі літери).
o беззнаковий int у вісімковому форматі
s нуль-термінований рядок
c окремий символ (char)
p вказівник у реалізаційно‑залежному вигляді.
a, A double у шістнадцятковому форматі, з префіксом 0x/0X.
n нічого не друкує, але записує кількість уже виведених символів у переданий вказівник на int.

Див. також

  • Програма «Hello, World!» — базовий приклад програми, вперше представлений у книзі «Мова програмування C» (книга «K&R»), яка в прикладі на C використовує printf для виведення повідомлення «Hello, World!»
  • Стандартна бібліотека C — стандартна бібліотека для мови програмування C.
  • printf (Unix) — команда оболонки для форматування та виведення тексту (англ.)
  • scanf — функція стандартної бібліотеки C, яка зчитує та аналізує текст зі стандартного вводу

Джерела

  1. printf. man.freebsd.org. Процитовано 17 січня 2026.
  2. fprintf, printf, snprintf, sprintf. en.cppreference.com. Процитовано 18 січня 2026.

Посилання