C++ snprintf() 函数
与 sprintf() 不同,snprintf()
中可以指定写入缓冲区的最大字符数。
snprintf() 函数原型
int snprintf( char* buffer, size_t buf_size, const char* format, ... );
snprintf()
函数将指向的字符串写入 buffer
。可以写入的最大字符数是 (buf_size-1)
。
在字符写入后,会添加一个终止的 null 字符。如果 buf_size
等于零,则不写入任何内容,buffer 可以是一个空指针。
它定义在 <cstdio>
头文件中。
snprintf() 参数
buffer
:指向要写入结果的字符串缓冲区的指针。buf_size
:指定要写入缓冲区的最大字符数,即buf_size-1
。format
:指向以 null 结尾的字符串的指针,该字符串将写入文件流。它由字符组成,还包含以%
开始的可选格式说明符。 格式说明符会被随后的变量值所替换。
格式说明符包含以下部分:
- 一个前导
%
符号 Flags
:可选的一个或多个标志,修改转换行为。-
:在字段内左对齐结果。默认为右对齐。+
:结果的符号附加到值的开头,即使对于正结果也是如此。- 空格:如果没有符号,结果的开头附加一个空格。
#
:执行转换的替代形式。0
:用于整数和浮点数。使用前导零而不是空格来填充数字。
Width
:一个可选的 _
或整数值,用于指定最小宽度字段。
Precision
:一个可选字段,由 .
后跟 _
或整数或无内容组成,用于指定精度。
Length
:一个可选的长度修饰符,指定参数的大小。
Specifier
:转换格式说明符。可用的格式说明符如下:
格式说明符 | 描述 |
---|---|
% | 打印 % |
c | 写入单个字符 |
s | 写入字符字符串 |
d 或 i | 将有符号整数转换为十进制表示 |
o | 将无符号整数转换为八进制表示 |
X 或 x | 将无符号整数转换为十六进制表示 |
u | 将无符号整数转换为十进制表示 |
F 或 f | 将浮点数转换为十进制表示 |
E 或 e | 将浮点数转换为十进制指数记数法 |
A 或 a | 将浮点数转换为十六进制指数 |
G 或 g | 将浮点数转换为十进制或十进制指数记数法 |
n | 返回此次调用函数到目前为止写入的字符数。结果写入参数所指向的值 |
p | 写入实现定义的字符序列以定义指针。 |
因此,格式说明符的一般格式是:%[flags][width][.precision][length]specifier
…
:其他附加参数,指定要打印的数据。它们按照格式说明符的顺序出现。
snprintf() 返回值
成功时,snprintf()
函数返回对足够大的缓冲区来说将被写入的字符数,不包括终止的 null 字符。失败时返回负值。
只有在返回值为非负数且小于 buf_size
时,输出才被认为完全写入。
示例:snprintf() 函数如何工作
#include <cstdio>
#include <iostream>
using
namespace std;
int main()
{
char buffer[100];
int retVal, buf_size = 100;
char name[] = "Max";
int age = 23;
retVal = snprintf(buffer, buf_size, "嗨,我是 %s,我今年 %d 岁", name, age);
if (retVal > 0 && retVal < buf_size)
{
cout << buffer << endl;
cout << "写入的字符数 = " << retVal << endl;
}
else
cout << "写入缓冲区错误" << endl;
return 0;
}
当你运行程序时,输出将会是:
嗨,我是 Max,我今年 23 岁
写入的字符数 = 34