printf в C/C++: простыми словами
Привет! Здесь мы поговорим о функции printf
. Эта функция доступна как в C, так и в C++, но влияние этой функции не ограничено этими двумя языками. Похожие функции вы сможете найти в Go, python, F#, и других.
Начнем мы с рассмотрения простых примеров использования printf
, чтобы получить представление о том, как она работает. Потом мы посмотрим на разнообразие модификаторов, которые делают эту функцию настолько полезной и универсальной.
Как вывести строку на экран используя printf
Функция printf
имеет следующий вид:
int printf ( const char * format, ... );
- Первым аргументом она принимает указатель на строку, которая говорит этой функции, что и как нужно вывести на экран.
- Далее функция принимает сколько угодно дополнительных параметров. Они будут использоваться в том случае, если
format
(первый аргумент) содержит упоминания этих самых дополнительных параметров. Тут мы будем передавать числа, строки и переменные, которые могут понадобиться для вывода на экран. - Возвращает функция сколько символов было выведено на экран.
Эта функция может показаться довольно сложной, но вам станет все понятнее после нескольких примеров:
#include <stdio.h>
int main() {
printf("1. просто строка \n");
printf("2. целое число: %d \n", 1234);
printf("3. дробное число: %f \n", 12.34);
printf("4. Символ: %c \n", 'C');
printf("5. строка: %s \n", "C++");
printf("6. процент: 100%% \n");
return 0;
}
Вывод этой программы:
1. просто строка
2. целое число: 1234
3. дробное число: 12.340000
4. Символ: C
5. строка: C++
6. процент: 100%
Давайте разберемся подробнее:
- Для вывода просто строки не нужно делать ничего особенного - просто передайте строку.
- Тут уже интереснее. Чтобы вывести целое число, которое передано дополнительным параметром, нам нужно его упомянуть в строке для форматирования. Для этого мы используем
%d
. Вprintf
, все упоминания начинаются со знака%
. После процента нужно указать как и что мы хотим вывести на экран. Для вывода целых чисел нужно указать буквуd
. Далее в статье мы разберем различные модификаторы, которые позволяют менять то, как именно это число будет выведено на экран. - Для вывода числа с плавающей точкой
float
нужно использовать%f
. - Для
char
мы используем%c
. - Для строк подойдет
%s
. - Но что делать если нам нужен просто процент? Не беда, для этого нужно просто указать процент два раза:
%%
. Тут логика похожа для вывода обратного слеша:\\
.
Что будет выведено на экран:
#include <stdio.h>
int main() {
int a = 10;
float b = 20.5;
char c = 'A';
printf("дробное: %f, символ: %c\n", a, b, c);
return 0;
}
Как видите, нет ничего сложного при работе с функцией printf
в простых случаях. Давайте теперь пойдем немного дальше и отформатируем строку посложнее:
printf("1. несколько аргументов: %d, %f \n", 1234, 12.34);
printf("2. минимальная ширина: %10d \n", 1234);
printf("3. лидирующие нули: %010d \n", 1234);
printf("4. количество знаков после запятой: %.9f, %.0f \n", 12.34, 12.34);
printf("5. шестнадцатеричное число: %x \n", 1234);
Вывод:
1. несколько аргументов: 1234, 12.340000
2. выравнивание: 1234
3. лидирующие нули: 0000001234
4. количество знаков после запятой: 12.340000000, 12
5. шестнадцатеричное число: 4d2
Давайте разберемся с программой выше:
- В одной строке Можно производить как угодно много замен. Для этого достаточно указать несколько спецификаторов вроде
%d
или%s
. - Мы можем указать минимальную ширину просто написав число после
%
. - Когда ширина заменяемого элемента оказывается меньше чем минимальная,
printf
по умолчанию использует пробелы. Мы можем сказатьprintf
‘у использовать ноль вместо пробела просто дописав0
после знака процента. - Мы можем не только указывать минимальную ширину для заменяемого элемента, но и количество цифр после запятой у дробных чисел. Для этого просто напишите сколько цифр вы хотите видеть следующим образом:
%.9f
(девять чисел после запятой). printf
можно заставить выводить целые положительные числа в системе счисления отличной от десятеричной. Для этого нужно использовать:%x
для шестнадцатеричных чисел;%o
для восьмеричных.
Поздравляю! Вы знаете большую часть того, что вам понадобиться при работе с printf
. Если же вы хотите узнать больше о этой функции, то ниже мы разберем все спецификаторы, которые поддерживает printf
.
Спецификаторы формата
Спецификатор формата имеет следующую структуру (в квадратных скобках опциональные модификаторы):
%[флаги][ширина][.точность][размер]тип
Обязательно нужно указать только знак вопроса и тип. Остальное можно опустить если вас устраивает вывод без них.
Тут довольно много различных модификаторов. Некоторые из них мы уже использовали выше, но большинство мы еще не встречали. Давайте пройдемся по каждому из них:
Тип
Тип | Описание | Пример | Вывод |
---|---|---|---|
d /i | Выводит целое число |
|
|
u | Выводит целое число без знака | printf("%u", 1234); | 1234 |
o | Выводит целое восьмеричное число без знака | printf("%o", 1234); | 2322 |
x | Выводит целое число без знака в шестнадцатеричной системе | printf("%x", 1234); | 4d2 |
X | Как x , только большими буквами | printf("%X", 1234); | 4D2 |
f | Выводит дробное число | printf("%f", 12.34); | 12.340000 |
F | Как f , только большими буквами | printf("%F \n", 1. / 0); | INF |
e | Выводит дробное число в экспоненциальной записи | printf("%e", 12.34); | 1.234000e+01 |
E | Как e , только большими буквами | printf("%E", 1234.); | 1.234000E+03 |
g | Выводит дробное число, используя экспоненциальную запись если она короче |
|
|
G | Как g , но большими буквами |
|
|
a | Выводит дробное число в шестнадцатеричной системе | printf("%a", -12.34); | -0x1.8ae147p+3 |
A | Как a , только большими буквами | printf("%A", -12.34); | -0X1.8AE147P+3 |
c | Выводит символ | printf("%c", 'C'); | C |
s | Выводит строку | printf("%s", "C++"); | C++ |
p | Выводит указатель |
| 0x104ddc000 |
n | Ничего не выводит. printf запишет количество символов, которые были выведены на экран до этого момента, в указатель переданный в соответствующем аргументе. |
| n = 4 |
% | Выводит процент | printf("%%"); | % |
Флаги
Флаг | Описание | Пример | Вывод |
---|---|---|---|
- | Выравнивает по левому краю |
|
|
+ | Выводит + для положительных чисел |
|
|
| Выводит для положительных чисел |
|
|
# | Выводит 0 , 0x , 0X перед числами типа %o , %x , %X соответственно (кроме нуля). Для дробных чисел выводит дробную часть независимо от ее наличия. |
|
|
0 | Выводит нули вместо пробела, когда указана ширина |
|
|
Ширина
Ширина | Описание | Пример | Вывод |
---|---|---|---|
число | Выводит минимальное число символов |
|
|
* | Как число, только оно передается в соответствующем аргументе |
|
|
Точность
Точность | Описание | Пример | Вывод |
---|---|---|---|
.число | Для целых чисел ( Для дробных ( Для Для строк ( Если по сле точки число не указано, подразумевается ноль. |
|
|
* | Как число, только оно передается в соответствующем аргументе |
|
|
Размер
Модификаторы размера нам нужны, потому что в C нет возможности понять размер переданного аргумента в printf
. Давайте посмотри на простой пример, чтобы продемонстрировать о чем я говорю:
long long int x = 10000000000; // десять миллиардов
printf("%d\n", x);
Вывод:
1410065408
Дело здесь в том, что printf
ожидает int
для спецификатора %d
. Значение типа long long int
просто не влезает, поэтому мы видим не то, что ожидали.
Чтобы решить эту проблему, ну жно явно указать размер целого числа, которое нужно вывести:
long long int x = 10000000000; // десять миллиардов
printf("%lld\n", x);
Вывод:
10000000000
Теперь вывод соответствует нашим ожиданиям. Вот таблица возможных типов:
Размер | Тип |
---|---|
hh |
|
h |
|
l |
|
ll |
|
j |
|
z |
|
t |
|
L |
|
Упражнения
-
Вывод строк с использованием
printf
:
Напишите программу на C++, которая использует функциюprintf
для вывода различных типов данных: целое число, дробное число, символ, строку и процент. Продемонстрируйте использование различных модификаторов, например, минимальной ширины, лидирующих нулей, количества знаков после запятой и шестнадцатеричного числа. -
Форматирование строки с различными типами данных:
Создайте программу, которая принимает от пользователя различные типы данных: целое число, дробное число, символ, строку и выводит их на экран, используя функциюprintf
с соответствующими модификаторами. -
Вывод значений в разных системах счисления:
Напишите программу, которая запрашивает у пользователя целое положительное число и выводит его на экран в десятичной, восьмеричной и шестнадцатеричной системах счисления, используя функциюprintf
.
Если хотите всегда быть в курсе последних новостей в мире программирования и IT, подписываетесь на мой Telegram-канал, где я делюсь свежими статьями, новостями и полезными советами. Буду рад видеть вас среди подписчиков!
Обсуждение