Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мова програмування С.docx
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
490 Кб
Скачать
☆

7.2 Форматований вивід - printf

Функція виводу, 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. Напишіть програму, яка виводитиме довільний текст вводу у розумний спосіб. Як мінімум, вона повинна відображати неграфічні знаки як вісімкові або шістнадцяткові числа, в залежності від вашого бажання, окрім цього розбивати довгі рядки тексту.