Функция vsnprintf () в C ++ используется для записи форматированной строки в строковый буфер.
В отличие от vsprintf (), максимальное количество символов, которое может быть записано в буфер, указано в vsnprintf()
.
vsnprintf () прототип
int vsnprintf (char * buffer, size_t buf_size, const char * format, va_list vlist);
vsnprintf()
Функция записывает строку , на которую указывает формат для строки символов буфера. Максимальное количество символов, которое можно записать, - buf_size. После того, как символы записаны, добавляется завершающий нулевой символ. Если buf_size равен нулю, ничего не записывается и буфер может быть нулевым указателем.
Формат строки может содержать спецификаторы формата, начинающиеся с%, которые заменяются значениями переменных, которые передаются в виде списка vlist.
Это определено в заголовочном файле.
vsnprintf () Параметры
- буфер: указатель на строку символов для записи результата.
- buf_size: максимальное количество символов для записи.
- формат: указатель на строку с завершающим нулем, которая записывается в файловый поток. Он состоит из символов и необязательных спецификаторов формата, начинающихся с%.
Спецификаторы формата заменяются значениями соответствующих переменных, следующих за строкой формата.
Спецификатор формата состоит из следующих частей:
- Ведущий знак%
- Флаги: необязательный один или несколько флагов, которые изменяют поведение преобразования.
- -: Выровнять результат по левому краю внутри поля. По умолчанию выравнивается по правому краю.
- +: Знак результата прикрепляется к началу значения даже для положительных результатов.
- Пробел: при отсутствии знака ставится пробел в начале результата.
- #: Выполняется альтернативная форма преобразования.
- 0: используется для целых чисел и чисел с плавающей запятой. Для дополнения чисел вместо пробела используются ведущие нули.
- Ширина: необязательное * или целочисленное значение, используемое для указания поля минимальной ширины.
- Точность: необязательное поле, состоящее из. за которым следует *, целое число или ничего, чтобы указать точность.
- Длина: необязательный модификатор длины, указывающий размер аргумента.
- Спецификатор: спецификатор формата преобразования. Доступные спецификаторы формата следующие:
Описатель формата Описание % Печать% c Записывает одиночный символ s Записывает символьную строку д или я Преобразует целое число со знаком в десятичное представление о Преобразует целое число без знака в восьмеричное представление X или x Преобразует целое число без знака в шестнадцатеричное представление. ты Преобразует целое число без знака в десятичное представление F или F Преобразует число с плавающей запятой в десятичное представление E или e Преобразует число с плавающей запятой в представление десятичной степени А или а Преобразует число с плавающей запятой в шестнадцатеричную экспоненту G или g Преобразует число с плавающей запятой в десятичное или десятичное представление экспоненты п Возвращает количество символов, записанных на данный момент этим вызовом функции. Результат записывается в значение, на которое указывает аргумент п Записывает последовательность символов, определяемую реализацией, определяющую указатель. Итак, общий формат спецификатора формата:
%(flags)(width)(.precision)(length)specifier
- vlist: список аргументов, содержащих данные для записи.
vsnprintf () Возвращаемое значение
- В случае успеха
vsnprintf()
функция возвращает количество записанных символов. - В случае неудачи возвращает отрицательное значение.
- Если длина форматированной строки больше, чем buf_size, ее необходимо обрезать. В таких случаях
vsnprintf()
функция возвращает общее количество символов, исключая завершающий нулевой символ, который был бы записан, если бы ограничение buf_size не было наложено.
Пример: как работает функция vsnprintf ()
#include #include void write(char* buf, int buf_size, const char *fmt,… ) ( va_list args; va_start(args, fmt); vsnprintf(buf, buf_size, fmt, args); va_end(args); ) int main () ( char buffer(100); char fname(20) = "Bjarne"; char lname(20) = "Stroustrup"; char lang(5) = "C++"; write(buffer, 27, "%s was created by %s %s", lang, fname, lname); printf("%s", buffer); return 0; )
Когда вы запустите программу, вывод будет:
C ++ был создан Bjarne