当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


C++ vsnprintf()用法及代码示例


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++ vsnprintf()。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。