C++ 中的vsnprintf() 函數用於將格式化的字符串寫入字符串緩衝區。
vsnprint()
函數是在 C++ 11 中引入的。與 vsprintf() 不同,可以寫入緩衝區的最大字符數在 vsnprintf()
中指定。
vsnprintf()原型
int vsnprintf( char* buffer, size_t buf_size, const char* format, va_list vlist );
vsnprintf()
函數將format
指向的字符串寫入字符串緩衝區。可寫入的最大字符數為 buf_size
。寫入字符後,添加終止空字符。如果buf_size
等於零,則不寫入任何內容並且buffer
可能是空指針。
字符串格式可能包含以 % 開頭的格式說明符,這些說明符被作為列表 vlist
傳遞的變量的值替換。
它在<cstdio> 頭文件中定義。
參數:
buffer
:指向要寫入結果的字符串的指針。buf_size
:要寫入的最大字符數。format
:指向寫入文件流的空終止字符串的指針。它由字符以及以 % 開頭的可選格式說明符組成。格式說明符被格式字符串後麵的各個變量的值替換。
格式說明符包含以下部分:
- 前導 % 符號
Flags
: 可選的一個或多個標誌,用於修改轉換行為。- -:左對齊字段內的結果。默認情況下它是右對齊的。
- +:結果的符號附加到值的開頭,即使是正麵結果也是如此。
- 空格:如果沒有符號,則在結果的開頭附加一個空格。
- #:執行另一種形式的轉換。
- 0:用於整數和浮點數。前導零用於填充數字而不是空格。
Width
:可選的 * 或整數值,用於指定最小寬度字段。Precision
:一個可選字段,由 .後跟 * 或整數或不指定精度。Length
:一個可選的長度修飾符,用於指定參數的大小。Specifier
: 轉換格式說明符。可用的格式說明符如下:格式說明符 說明 % 印刷 % c 寫入單個字符 s 寫入一個字符串 d 或 i 將有符號整數轉換為十進製表示 o 將無符號整數轉換為八進製表示 X 或 x 將無符號整數轉換為十六進製表示 u 將無符號整數轉換為十進製表示 F 或 f 將浮點數轉換為十進製表示 E 或 e 將浮點數轉換為十進製 index 表示法 一個或一個 將浮點數轉換為十六進製 index 克或克 將浮點數轉換為十進製或十進製 index 表示法 n 返回到目前為止此函數調用寫入的字符數。結果寫入參數指向的值 p 編寫定義指針的實現定義的字符序列。 所以格式說明符的一般格式是:
%[flags][width][.precision][length]specifier
vlist
:包含要寫入的數據的參數列表。
返回:
- 如果成功,
vsnprintf()
函數會返回寫入的字符數。 - 失敗時返回負值。
- 當格式化字符串的長度大於
buf_size
時,需要截斷。在這種情況下,如果沒有施加buf_size
限製,vsnprintf()
函數會返回不包括終止空字符的字符總數。
示例:vsnprintf() 函數的工作原理
#include <cstdio>
#include <cstdarg>
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\n", lang, fname, lname);
printf("%s", buffer);
return 0;
}
運行程序時,輸出將是:
C++ was created by Bjarne
相關用法
- C++ vscanf()用法及代碼示例
- C++ vswscanf()用法及代碼示例
- C++ vsscanf()用法及代碼示例
- C++ vswprintf()用法及代碼示例
- C++ vsprintf()用法及代碼示例
- C++ valarray cos用法及代碼示例
- C++ valarray abs用法及代碼示例
- C++ vector data()用法及代碼示例
- C++ vector::max_size()用法及代碼示例
- C++ vector::rbegin()用法及代碼示例
- C++ vector rbegin()、rend()用法及代碼示例
- C++ valarray cshift用法及代碼示例
- C++ valarray resize用法及代碼示例
- C++ valarray pow()用法及代碼示例
- C++ valarray exp()用法及代碼示例
- C++ valarray log10用法及代碼示例
- C++ vector::pop_back()用法及代碼示例
- C++ valarray sinh用法及代碼示例
- C++ valarray cos()用法及代碼示例
- C++ vwscanf()用法及代碼示例
注:本文由純淨天空篩選整理自 C++ vsnprintf()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。