Оглавление
Формат вывода #
C/C++ поддерживает вывод форматированных строк при помощи семейства функций printf(строка, ...)
, где в ...
передаются переменные и числа в любом количестве, а в строке
указываются их метки в порядке передачи в функцию в особом формате, то что в [квадратных скобках]
- опционально:
%[флаг][ширина][.точность][размер]тип
флаг #
-
- выровнять по левому краю в пределахширины
(по умолч. выравнивается по правому)+
- принудительно выводить знак числа, даже если это +пробел
- если знак числа не выводится, вывести на его месте пробел#
- для ненулевых значений типовo
,x
иX
вывести префикс0
,0x
и0X
соответственно. Для типовe
,E
,f
,F
,g
иG
выводить десятичную точку даже для нулевого значения0
- заполнить свободные места в пределахширины
нулями вместо пробелов
ширина #
число
- минимальная ширина вывода значения, свободные места заполнятся пробелами*
- ширина указывается в предыдущем целочисленном аргументе
точность #
.число
- для целочисленных - минимальное количество напечатанных цифр. Если значение короче этой длины - дополнить нулями. Для плавающей точки - количество цифр после разделителя (по умолчанию 6). Если указана просто точка, без значения, то считается за.0
.*
- точность указывается в предыдущем целочисленном аргументе
размер #
Указание конкретного размера данных для целочисленного типа
Размер | d i | u o x X | f F e E g G | c | s | p | n |
---|---|---|---|---|---|---|---|
нет | int | unsigned int | double | int | char* | void* | int* |
hh |
signed char | unsigned char | signed char* | ||||
h |
short | unsigned short | short* | ||||
l |
long | unsigned long | wint_t | wchar_t* | long* | ||
ll |
long long | unsigned long long | long long* | ||||
j |
intmax_t | uintmax_t | intmax_t* | ||||
z |
size_t | size_t | size_t* | ||||
L |
long double |
тип #
d
,i
- десятичное число со знакомu
- десятичное число без знакаo
- 8-разрядное число без знакаx
- 16-разрядное число без знака маленькими буквамиX
- 16-разрядное число без знака большими буквамиf
- число с плавающей точкойe
- научный тип записи, маленькие буквыE
- научный тип записи, большие буквыg
- короткое представлениеe
иf
G
- короткое представлениеE
иF
c
- символs
- строкаp
- вывести адрес указателяn
- указатель на переменную целого типа, в неё запишется текущее количество напечатанных символов%
- "экранирование", выведет %
Примеры #
printf("Привет, мир!\n");
printf("Число 10 в десятичной системе: %d\n", 10);
printf("Число 10 в шестнадцатеричной системе: %x\n", 10);
printf("Число 10 в восьмеричной системе: %o\n", 10);
printf("Число с плавающей точкой: %f\n", 3.14159);
printf("Число с точностью: %.2f\n", 3.14159);
printf("Строка: %s\n", "Hello, World!");
printf("Символ: %c\n", 'A');
int i = 100;
long l = 123456;
long long ll = 1234567898765;
printf("Печать int: i = %d, l = %ld, ll = %lld\n", i, l, ll);
printf("Печать числа с ведущими нулями: %05d\n", 7);
printf("Печать числа в десятичной системе: %d\n", -100);
printf("Печать числа с настраиваемой шириной: %10d\n", 123);
printf("Печать символа с точностью: %.2f\n", 1.23456);
printf("Печать с разрядностью: %10.3f\n", 123.4567);
printf("Печать строки с пробелами: \"%s\"\n", "Some string with spaces.");
printf("Печать целого числа с разрядностью: %010d\n", 42);
printf("Печать строки с помощью указателя: %s\n", "Pointer-based string");
printf("Печать целого числа в шестнадцатеричной системе: %X\n", 255);
printf("Печать текста с использованием escape-последовательности: \"Escape \\n test\"\n");
// Привет, мир!
// Число 10 в десятичной системе: 10
// Число 10 в шестнадцатеричной системе: a
// Число 10 в восьмеричной системе: 12
// Число с плавающей точкой: 3.141590
// Число с точностью: 3.14
// Строка: Hello, World!
// Символ: A
// Печать int: i = 100, l = 123456, ll = 1234567898765
// Печать числа с ведущими нулями: 00007
// Печать числа в десятичной системе: -100
// Печать числа с настраиваемой шириной: 123
// Печать символа с точностью: 1.23
// Печать с разрядностью: 123.457
// Печать строки с пробелами: "Some string with spaces."
// Печать целого числа с разрядностью: 0000000042
// Печать строки с помощью указателя: Pointer-based string
// Печать целого числа в шестнадцатеричной системе: FF
// Печать текста с использованием escape-последовательности: "Escape \n test"
stdio.h #
Вывод #
printf #
int printf(const char* format, ...)
Напечатать форматированную строку
format
в консоль (для компьютера), вернёт количество записанных символов.snprintf #
int snprintf(char* s, size_t n, const char* format, ...)
Напечатать форматированную строку
format
в буфер s
размера n
, вернёт количество записанных символов:
char buf[100];
int res = snprintf(buf, 100, "10 * 20 = %d", 10 * 20);
// buf == "10 * 20 = 200"
// res == 13
sprintf #
int sprintf(char* str, const char* format, ...)
Напечатать форматированную строку
format
в буфер s
, вернёт количество записанных символов. Небезопасный аналог snprintf
без указания размера буфера.sscanf #
int sscanf(const char* s, const char* format, ...)
Парсить строку
s
в формате format
в переменные, вернёт количество успешно записанных значений:
char str[] = "42 3.14 text";
int i;
float f;
char text[20];
sscanf(str, "%d %f %s", &i, &f, text);
// i == 42
// f == 3.14
// text == "text"
char str[] = "12-11-2024";
int day, month, year;
sscanf(str, "%d-%d-%d", &day, &month, &year);
// day == 12
// month == 11
// year == 2024
vsnprintf #
int vsnprintf(char* s, size_t n, const char* format, va_list arg)
Аналог
snprintf
, но принимает список аргументов как arg
типа va_list
, вернёт количество успешно записанных символов:
#include <stdarg.h>
void func(const char *format, ...) {
char buffer[50];
va_list args;
va_start(args, format);
vsnprintf(buffer, sizeof(buffer), format, args);
va_end(args);
// buffer == "Студент: Иван, Возраст: 20"
}
int main() {
func("Студент: %s, Возраст: %d", "Иван", 20);
}
vsprintf #
int vsprintf(char* s, const char* format, va_list arg)
Небезопасный аналог
vsnprintf
без указания размера буфера.vsscanf #
int vsscanf(const char* s, const char* format, va_list arg)
Аналог
sscanf
, но принимает список аргументов как arg
типа va_list
, вернёт количество успешно записанных значений:
void func(const char *str, const char *format, ...) {
va_list args;
va_start(args, format);
vsscanf(str, format, args);
va_end(args);
}
int main() {
int num;
char text[20];
func("42 Hello", "%d %s", &num, text);
// num == 42
// text == "Hello"
}