Функция snprintf
Функция snprintf форматирует данные и записывает
результат в символьный буфер, не превышая заданный
размер. В первый параметр мы передаём указатель на
буфер, во второй - максимальное количество символов,
которое можно записать (включая завершающий нуль),
в третий - строку формата, а далее - аргументы для
подстановки в этот формат. Функция возвращает
количество символов, которое было бы записано, если
бы размер буфера был неограничен. Это позволяет
заранее узнать необходимый размер буфера.
Синтаксис
int snprintf(char* buffer, size_t size, const char* format, ...);
Пример
Давайте запишем в буфер строку с именем и возрастом,
ограничив размер буфера 50 символами:
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
char buffer[50];
int age = 25;
int res = snprintf(buffer, sizeof(buffer), "Name: %s, Age: %d", "Alex", age);
cout << buffer << endl;
cout << "Written: " << res << endl;
return 0;
}
Результат выполнения кода:
"Name: Alex, Age: 25"
"Written: 19"
Пример
Давайте убедимся, что функция не переполнит буфер,
если строка окажется слишком длинной. Буфер размером
10 символов, а строка значительно длиннее:
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
char buffer[10];
int res = snprintf(buffer, sizeof(buffer), "Value: %s", "abcdefghij");
cout << buffer << endl;
cout << "Needed: " << res << endl;
return 0;
}
Результат выполнения кода:
"Value: ab"
"Needed: 16"
Как видим, в буфер поместилось только 9 символов
плюс завершающий нуль, а возвращённое значение 16
показывает, сколько символов потребовалось бы на самом деле.
Пример
Давайте используем возвращённое значение, чтобы выделить буфер нужного размера динамически:
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int main()
{
int needed = snprintf(nullptr, 0, "Sum: %d", 12345);
char* buffer = (char*)malloc(needed + 1);
snprintf(buffer, needed + 1, "Sum: %d", 12345);
cout << buffer << endl;
free(buffer);
return 0;
}
Результат выполнения кода:
"Sum: 12345"