From e5abc1fe99340b979b18864d978179f71fe8f5c5 Mon Sep 17 00:00:00 2001 From: vlapa Date: Sat, 13 Jun 2026 20:33:26 +0300 Subject: First --- _PROGRAMs/C++/snprintf.md | 48 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 _PROGRAMs/C++/snprintf.md (limited to '_PROGRAMs/C++/snprintf.md') diff --git a/_PROGRAMs/C++/snprintf.md b/_PROGRAMs/C++/snprintf.md new file mode 100644 index 0000000..376e26b --- /dev/null +++ b/_PROGRAMs/C++/snprintf.md @@ -0,0 +1,48 @@ +# snprintf в C/C++: разбираемся с примерами + +👋 Привет! В этой статье мы поговорим о функции `snprintf`. В отличие от функции [`sprintf`](https://codelessons.dev/ru/sprintf-in-c-cplusplus/), она принимает дополнительный аргумент: максимальная длинна C-строки, которая будет записана по адресу. Сначала мы посмотрим на сигнатуру этой функции, а потом напишем простую программу, чтобы продемонстрировать работу этой функции. В [конце статьи](https://codelessons.dev/ru/snprintf-in-c-cplusplus/#%D1%83%D0%BF%D1%80%D0%B0%D0%B6%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F) вы найдете упражнения для закрепления материала. + +![Иллюстрация snprintf](https://codelessons.dev/static/e86a1cafb44e5cd0493300384183ff37/5a190/snprintf-illustration.png) + +## Как отформатировать строку используя snprintf + +Функция `snprintf` объявлена в заголовочном файле ``. В C++ вы также можете использовать ``. + +`snprintf` форматирует строку как [`printf`](https://codelessons.dev/ru/printf-in-c-cplusplus/), но записывает результат работы по адресу, вместо того, чтобы вывести строку в стандартный вывод. Также эта функция принимает максимальное количество байтов, которые нужно записать по адресу. Это делает ее более безопасной альтернативой функции `sprintf`. + +Прототип этой функции выглядит следующим образом: + +```cpp +int snprintf(char* s, size_t n, const char* format, ...); +``` + +- Первым аргументом функция принимает ссылку на начало строки, куда будет записан результат ее работы. В конец строки будет обязательно записан символ ее окончания - `\0`. +- Вторым аргументом мы передаем максимальное количество байтов, которые будут записаны по адресу (первый аргумент). В максимальное количество байтов включается `\0`. +- Третьим аргументом передается строка форматирования. +- Далее передаются дополнительные аргументы. Их количество зависит от используемых [спецификаторов формата](https://codelessons.dev/ru/printf-in-c-cplusplus/#%D1%81%D0%BF%D0%B5%D1%86%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D1%8B-%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B0) в строке форматирования (третий аргумент). +- Возвращает функция длину отформатированной строки (как и `printf`). На это число не влияет максимальное число записанных байтов `n` (второй аргумент). + +Теперь давайте посмотрим на простой пример использования этой функции: + +```c +#include + +int main() { + int a = 1, b = 2; + char s[6]; + + int n = snprintf(s, 6, "%d + %d = %d", a, b, a + b); + + printf("s = %s, n = %d", s, n); + + return 0; +} +``` + +Вывод программы: + +```console +s = 1 + 2, n = 9 +``` + +Как вы можете видеть, функция обрезала строку. Только первые пять символов попали в `s` (только пять, потому что последний символ занимает `\0`). \ No newline at end of file -- cgit v1.2.3