函数
<cstdio>

vsnprintf

int vsnprintf (char * s, size_t n, const char * format, va_list arg );
将可变参数列表中的格式化数据写入指定大小的缓冲区
它会组合一个字符串,其文本与使用 formatprintf 上打印的文本相同,但是它使用由 arg 标识的可变参数列表中的元素而不是额外的函数参数,并将结果内容作为 C 字符串 存储在由 s 指向的缓冲区中(以 n 作为要填充的最大缓冲区容量)。

如果结果字符串的长度超过n-1个字符,则剩余的字符将被丢弃而不存储,但会计算在函数返回的值中。

在内部,该函数从由 arg 标识的列表中检索参数,就像对其使用了 va_arg 一样,因此 arg 的状态很可能会因调用而改变。

无论如何,arg 应该在调用之前的某个时刻由 va_start 初始化,并且预计在调用之后的某个时刻由 va_end 释放。

参数

s
指向存储结果 C 字符串的缓冲区的指针。
该缓冲区的大小应至少为 n 个字符。
n
缓冲区中要使用的最大字节数。
生成的字符串长度最多为n-1,为额外的终止空字符留出空间。
size_t 是一个无符号整数类型。
format
一个 C 字符串,包含一个格式化字符串,其遵循与 printf 中的 format 相同的规范(详见 printf)。
arg
一个标识由 va_start 初始化的可变参数列表的值。
va_list 是在 <cstdarg> 中定义的特殊类型。

返回值

如果 n 足够大,本应写入的字符数,不包括结尾的空字符
如果发生编码错误,则返回一个负数。
请注意,只有当此返回值非负且小于 n 时,字符串才被完全写入。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/* vsnprintf example */
#include <stdio.h>
#include <stdarg.h>

void PrintFError ( const char * format, ... )
{
  char buffer[256];
  va_list args;
  va_start (args, format);
  vsnprintf (buffer,256,format, args);
  perror (buffer);
  va_end (args);
}

int main ()
{
   FILE * pFile;
   char szFileName[]="myfile.txt";

   pFile = fopen (szFileName,"r");
   if (pFile == NULL)
     PrintFError ("Error opening '%s'",szFileName);
   else
   {
     // file successfully open
     fclose (pFile);
   }
   return 0;
}

在此示例中,如果文件myfile.txt不存在,则调用 perror 来显示类似于以下的错误消息

Error opening file 'myfile.txt': No such file or directory


另见