summaryrefslogtreecommitdiff
path: root/_PROGRAMs/C++/snprintf.md
diff options
context:
space:
mode:
authorvlapa <vlapa@ya.ru>2026-06-13 20:33:26 +0300
committervlapa <vlapa@ya.ru>2026-06-13 20:33:26 +0300
commite5abc1fe99340b979b18864d978179f71fe8f5c5 (patch)
tree98fd0ad7c6d0744894d6e74e446daacd9e6dd1b5 /_PROGRAMs/C++/snprintf.md
First
Diffstat (limited to '_PROGRAMs/C++/snprintf.md')
-rw-r--r--_PROGRAMs/C++/snprintf.md48
1 files changed, 48 insertions, 0 deletions
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` объявлена в заголовочном файле `<stdio.h>`. В C++ вы также можете использовать `<cstdio>`.
+
+`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 <stdio.h>
+
+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