Стандартна функція консольного виводу в мові C – printf. Опис її міститься в заголовочном файлі stdio.h. За допомогою цієї функції можна виводити дані або користувальницькі повідомлення в консоль. Мова C чутливий до регістру. Наприклад, дві функції printf і scanf відрізняються від подібних їм Printf і Scanf. Всі символи у функції printf і scanf також повинні бути записані в нижньому регістрі. Одним з найпростіших прикладів C printf, що виводить на екран знайоме привітання hello world, є:
Визначення групи функцій printf у файлі "stdio.h"
Файл "stdio.h" належить до стандартної бібліотеки вводу/виводу в мові С. Опис printf і подібних їй функцій наводиться в ньому наступним чином:
Перераховані функції виробляють завантаження даних з певних локацій, перетворюють їх у символьну рядок, відправляють в задані потоки виводу.
Сімейство функцій printf
Функції групи printf в мові C служать для обробки і форматованого виводу даних у стандартний потік. Причому функції printf і vprintf виробляють запис у стандартний потік stdout, функції fprintf і vfprintf відправляють значення аргументів виводяться в деякий заданий вихідний потік, а snprintf, sprintf, vsnprintf і vsprintf записують дані в символьну рядок. Всі перераховані функції працюють з використанням рядка формату, що вказує необхідні перетворення аргументів для виводу.
Функція fprintf записує результат у вихідний потік stream. В буфер, який представляє собою символьну рядок, виводить результат функція sprintf. Поведінка функції не визначено, якщо підлягає висновку рядок перевищує розмір масиву буфера.
Функція snprintf так само, як і попередня, записує дані в рядковий буфер. Отримана рядок символів завершується нульовим символом, якщо тільки bufsz (розмір буфера) не дорівнює нулю. Інакше, якщо значення bufsz дорівнює нулю, то в буфер нічого не виводиться, а сам буфер цілком може бути нульовим покажчиком, але обчислене значення (кількість байтів, яке повинно було бути записано) все одно обчислюється. Функція printf_s в цілому діє тим же чином, що і printf, за винятком одного моменту. Головною відмінністю в описі printf_s в C і printf є наступне: функція printf_s виконує перевірку рядка форматування на наявність допустимих символів на відміну від printf, яка тільки перевіряє рядок формату на предмет порожнього покажчика. Детальніше розглянемо функцію printf.
Загальний опис
У мові C друк символів через стандартний потік виводу здійснюється за допомогою виклику функції printf. Команда printf в C форматує набір виведених даних, і вони відправляються в стандартний потік виводу (stdout. Значення, передані в якості аргументів функції, виводяться в консоль згідно зазначеної рядку форматування, яка в свою чергу містить у собі два різновиди елементів. Перший різновид - це символи, що виводяться на екран, а елементи, що визначають особливості формату даних і відповідають за метод представлення аргументів при виведенні, відносяться до другого виду.
При виведенні змінних з printf в C особливі комбінації символів у рядку аргументів замінюються на перетворені у відповідності з цими символами дані, причому для кожного типу даних існують свої специфікації формату виводу.
Тип функції і значення, що повертається
Функція printf, що має тип int, повертає цілочисельну величину, що позначає кількість надрукованих символів на екрані. Наприклад, можна присвоїти: int k = printf("Привіт" %c %d %s", 'a', 11 "всім!"), і тоді за значенням змінної k легко визначається, виникла помилка при виведенні. У разі повернення від'ємного значення (якщо функція повернула "-1"), можна зробити висновок, що сталася помилка при її виконанні.
Синтаксис і залежно
Щоб використовувати функцію printf, потрібно підключити заголовковий файл "stdio.h" наступним чином: #include Шаблон функції виглядає: int printf(const char *формат, ) Під трьома крапками мається на увазі список аргументів, що підлягають виведенню. Функція printf може бути використана з різним числом аргументів, але перший з них завжди обмежується з обох сторін подвійними лапками, а кожен наступний необхідно відокремлювати від попереднього коми. Те, що записано в подвійних лапках і при тому не є специфікацією формату, друкується без змін, інакше, якщо зустрівся спецификатор, копіюється тип його значення. Форма завдання специфікацій формату: %[флаги] [ширина] [.позиция] [длина]тип
Форматування printf в C вихідних значень
Читання рядка формату, яка вказується у круглих дужках після імені викликається функції, відбувається тільки в один бік-зліва направо, і перший аргумент, зазначений після самої рядка виводиться лише в тому випадку, якщо зустрілася перша специфікація. До тих пір, поки не скінчиться рядок формату, зазначені в ній специфікації будуть ініціювати перетворення і друк наступних аргументів. У рядку формату знак пробілу розглядається, як звичайний символ і передається на висновок у випадках, коли він не використовується у виразі специфікації формату.
Символ "%" вказує на початок специфікації формату виводу, слідом за ним йде код формату. Усі поля в специфікації являють собою окремі, визначають умови форматування числа або символи. Форматований вивід printf в C володіє своїми особливостями. У разі, якщо кількість перерахованих аргументів перевищує число специфікацій формату, вони пропускаються і не виводяться. Інакше, якщо специфікацій формату більше, ніж значень у списку підлягають друку аргументів, результат виклику функції не визначається. Для явної вказівки, який за рахунком аргумент потрібно задіяти, можливо використовувати "%m$" замість "%" і "*m$" замість "*", причому m, ціле десяткове значення, позначає позицію потрібного аргументу (індексування починається з одиниці).
Параметри
stream
Вихідний потік для запису у файл
buffer
Покажчик на символьну рядок для подальшого запису в неї
bufsz
Визначає кількість символів, допустимий для запису: максимальне значення - bufsz-1 і ще нульовий обмежувач
format
Покажчик на багатобайтове рядок з нульовим обмежувачем, що визначає, як інтерпретувати виводяться аргументи
Прапори, що використовуються в рядку формату
Прапор
Опис
-
Вирівнювання результату по лівому краю в поле виводу
+
При виведенні чисельного значення, має знак, примусово друкується "+" перед позитивною величиною (за замовчуванням виводиться тільки "-" перед від'ємним значенням)
0
Для цілих чисел і чисел з плаваючою комою провідні нулі використовуються замість символів пробілу для заповнення лівих розрядів у разі, якщо задана ширина поля, що перевищує довжину числа. Для цілих чисел прапор ігнорується, якщо явно вказана точність. Для інших перетворень з використанням цього прапора поведінку функції не визначено. Прапор "0" не враховується, якщо присутній прапор "-"
space
Якщо результат виведення виразу, що має знак, не починається з символу цього знака або порожній, то пробіл додається до результату. Прапор "space" ігнорується, якщо є позначка "+"
#
Виконується альтернативна форма перетворення
Керуючі послідовності
Послідовність
Результат
a
Звуковий сигнал
n
Переклад на новий рядок
r
Повернення курсору на початок рядка
t
Табуляція
v
Вертикальна табуляція
"
Висновок подвійний лапки
Висновок косою риси
Різні специфікатори формату
Спецификатор формату
Використання та опис printf C
Тип аргументу
%
Запис літерала "%"
c
Висновок одного символу. Відбувається перетворення аргументу тип unsigned char. При використанні модифікатора "l" аргумент перетворюється в рядок символів
unsigned char
s
Друк рядків символів. Аргумент повинен бути дороговказом на початковий елемент масиву символів char
char *
d
i
Висновок десяткового подання цілочисельного значення зі знаком
int
o
Висновок восьмеричного подання без знакового цілочисельного значення
unsigned int
x
X
Висновок шістнадцяткове подання без знакового цілочисельного значення. Символи "a", "b", "c", "d", "e", "f" застосовуються для перетворення "x". А для перетворення "X" - "A", "B", "C", "D", "E", "F"
unsigned int
u
Висновок десяткового перетворення без знакового цілочисельного значення. Якщо перетворене значення і точність разом дорівнюють 0 то символи не відображаються
unsigned int
f
F
Висновок десяткового подання числа з плаваючою комою, що має знак
double
e
E
Висновок десяткового експоненціального подання числа з плаваючою комою, округленого і перетвореного так, що перед комою залишається одна цифра, а кількість цифр після коми відповідає точності представлення (за замовчуванням точність дорівнює 6 а якщо вказаний 0 то символ комою не виводиться взагалі). Символ "е" виводиться у верхньому або нижньому регістрі залежно від перетворення
double
a
A
Висновок шістнадцяткового подання числа з плаваючою комою
double
g
G
Висновок десяткового подання числа з плаваючою комою або його десяткового експоненціального подання в залежності від значення і точності
double
n
Повернення числа елементів, виведених функцією printf. Результат записується в змінну, на яку вказує аргумент. Специфікація може не містити прапорів, ширини поля або точності
int *
p
Висновок покажчика
void *
Модифікатор ширини поля
У рядку формату printf C може бути записано ціле число після знака відсотка і перед командою форматування. Воно є модифікатором ширини поля і впливає на уявлення відображуваних даних. Найменша ширина поля, призначена для значення, визначається цим числом, і присутність такого модифікатора у разі, якщо аргумент виявляється менше виділеного йому поля, викликає додавання до результату прогалин або нулів. Заповнювачем за замовчуванням служить символ пробілу, проте можна встановити нуль, прописавши його перед специфікацією ширини. Модифікатор вказує мінімум ширини, і будь-яке перевищує цей мінімум значення буде надруковано без перешкод. Число, наприклад, що складається менше ніж з восьми символів і печатаемое зі специфікацією "%08d", виявиться доповненим до необхідних восьми знаків нулями. Подібні модифікатори можуть також задавати параметри точності або вирівнювання.
Модифікатор точності
Модифікатор точності служить для визначення кількості друкованих знаків у поданні чисел. Для додавання модифікатора точності необхідно поставити крапку після специфікації ширини поля і вказати потрібне значення точності після неї. Модифікатор точності визначається для "e", "f", "a", "E", "A" і "F" форматів. Для цілих чисел модифікатор встановлює кількість відображуваних цифр, додаючи нулі в лівий розряд, якщо потрібно, а при виведенні раціональних чисел визначає необхідну кількість знаків після коми. Стосовно до строкових змінних: наступне після точки число в модифікаторі точності служить засобом визначення максимальної довжини поля при виведенні. Наприклад, при заданої специфікації формату "%4.8 s" буде виведено рядок, довжина якої знаходиться в діапазоні від чотирьох до восьми символів, у разі перевищення крайні символи будуть опущені.
Інші модифікатори формату
Вирівнювання за замовчуванням є вирівнювання по правому краю, однак це можна змінити, поставивши знак "-" після "%". Така специфікація формату встановлює вирівнювання по лівому краю. Крім того, функція printf здатна розрізняти короткі і довгі типи виведених цілих значень. Допустимі специфікатори: "про", "d", "u", "i", "x" і "X". Довгий тип значення встановлюється модифікатором "l", а короткий – модифікатором "h". Наприклад, при виведенні довгого цілого числа та значення типу unsigned short int специфікації формату виглядають як "%ld" і "%hu" відповідно.
Довжина
Опис
h
Для типів short або unsigned short
l
Для типів long або unsigned long
L
Для типу long double
Приклади
1. Опис printf C і результати виклику кожної функції:
2. Висновок на екран простого діалогового повідомлення: printf("повідомлення"); 3. Програмний код:
Вирази, задані в подвійних лапках перед специфікаціями формату, друкуються на екрані, також як і наступні за рядком формату аргументи. Результат виконання наведених вище функцій printf C, опис вихідних даних:
Даний приклад ілюструє висновок на екран за допомогою різних форматів рядків, цілочисельних змінних, символів, а також чисел з плаваючою точкою.
Стандартна функція введення scanf і приклади її використання
Функція scanf використовується для читання вводяться з клавіатури даних. Опис printf і scanf в C представлено в заголовочном файлі "stdio.h". scanf("format specifiers",&value1&value2 );
Простий приклад роботи з функцією scanf: #include int main(){ int a; float b; scanf("%d%f",&a,&b); }