与 sprintf() 不同,snprintf()
指定了可以写入缓冲区的最大字符数。
snprintf() 原型
int snprintf( char* buffer, size_t buf_size, const char* format, ... );
snprintf()
函数将 format 指向的 字符串 写入 buffer。可以写入的最大字符数为 (buf_size-1)
。
写入字符后,会添加一个终止的 null 字符。如果 buf_size 为零,则不写入任何内容,buffer 可以是空指针。
它定义在 <cstdio> 头文件中。
snprintf() 参数
- buffer:指向要写入结果的字符串缓冲区的 指针。
- buf_size:指定要写入 buffer 的最大字符数,即 buf_size-1。
- format:指向写入文件流的以 null 结尾的字符串的指针。它包含字符以及可选的以 % 开头的格式说明符。
格式说明符将替换后面格式字符串的相应 变量 的值。
格式说明符包含以下部分
- 一个前导 % 符号
- Flags:可选的一个或多个标志,用于修改转换行为。
- - : 将结果左对齐到字段中。默认情况下是右对齐。
- + : 结果的符号附加到值的开头,即使对于正数也是如此。
- Space: 如果没有符号,则在结果开头附加一个空格。
- # : 执行替代形式的转换。
- 0 : 用于整数和浮点数。数字前面会用零填充而不是空格。
- Width:可选的 * 或整数值,用于指定最小字段宽度。
- Precision : 可选字段,由 . 加上 * 或整数或为空组成,用于指定精度。
- Length : 可选长度修饰符,用于指定参数的大小。
- Specifier:转换格式说明符。可用的格式说明符如下
格式说明符 描述 % 打印 % c 写入单个字符 s 写入字符串 d or i 将有符号整数转换为十进制表示 o 将 无符号整数 转换为八进制表示 X 或 x 将无符号整数转换为十六进制表示 u 将无符号整数转换为十进制表示 F or f 将浮点数转换为十进制表示 E or e 将浮点数转换为十进制指数表示 A or a 将浮点数转换为十六进制指数 G or 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, "Hi, I am %s and I am %d years old", name, age);
if (retVal > 0 && retVal < buf_size)
{
cout << buffer << endl;
cout << "Number of characters written = " << retVal << endl;
}
else
cout << "Error writing to buffer" << endl;
return 0;
}
运行程序后,输出将是
Hi, I am Max and I am 23 years old Number of characters written = 34
另请阅读