View Categories

Форматированные строки

Формат вывода #

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"
}
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Прокрутить вверх