C++ snprintf()

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

另请阅读

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战