跳到主要内容

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