RtlStringCbPrintfA 函数 (ntstrsafe.h)

RtlStringCbPrintfWRtlStringCbPrintfA 函数创建字节计数的文本字符串,其格式基于提供的格式信息。

语法

NTSTRSAFEDDI RtlStringCbPrintfA(
  [out] NTSTRSAFE_PSTR  pszDest,
  [in]  size_t          cbDest,
  [in]  NTSTRSAFE_PCSTR pszFormat,
        ...             
);

参数

[out] pszDest

指向调用方提供的缓冲区的指针,该缓冲区接收格式化的以 null 结尾的字符串。 该函数从 pszFormat 和函数的参数列表提供的格式字符串创建此字符串。

[in] cbDest

目标缓冲区的大小(以字节为单位)。 缓冲区必须足够大,才能包含格式化字符串和终止 null 字符。

对于 Unicode 字符串,最大字节数NTSTRSAFE_MAX_CCH * sizeof(WCHAR)。

对于 ANSI 字符串,最大字节数为 NTSTRSAFE_MAX_CCH * sizeof(char)。

[in] pszFormat

指向以 null 结尾的文本字符串的指针,该字符串包含 printf样式 格式设置指令

...

函数根据 pszFormat 字符串中包含的格式指令解释的参数列表。

返回值

该函数返回下表中列出的 NTSTATUS 值之一。 有关如何测试 NTSTATUS 值的信息,请参阅 使用 NTSTATUS 值

返回代码 描述
STATUS_SUCCESS
成功 状态意味着源数据存在,创建字符串时没有截断,生成的目标缓冲区为 null 终止。
STATUS_BUFFER_OVERFLOW
警告 状态意味着作由于目标缓冲区中的空间不足而未完成。 目标缓冲区包含输出字符串的截断版本。
STATUS_INVALID_PARAMETER
错误 状态意味着函数收到了无效的输入参数。 有关详细信息,请参阅以下段落。

此函数在以下情况下返回STATUS_INVALID_PARAMETER值:

  • cbDest 中的值大于最大缓冲区大小。
  • 目标缓冲区已满。
  • 存在 NULL 指针。
  • 目标缓冲区的长度为零,但存在非零长度源字符串。

言论

应使用 RtlStringCbPrintfWRtlStringCbPrintfA,而不是以下函数:

  • sprintf
  • swprintf
  • _snprintf
  • _snwprintf
所有这些函数都接受格式字符串和参数列表,解释它们,并创建格式化字符串。 目标缓冲区的大小(以字节为单位)提供给 RtlStringCbPrintfWRtlStringCbPrintfA 以确保它们不会写入缓冲区末尾。

使用 RtlStringCbPrintfW 处理 Unicode 字符串,并使用 RtlStringCbPrintfA 来处理 ANSI 字符串。 所使用的窗体取决于你的数据,如下表所示。

字符串数据类型 字符串文本 功能
WCHAR L“string” RtlStringCbPrintfW
char “string” RtlStringCbPrintfA
 

如果 pszDestpszFormat 指向重叠字符串,或者任何参数字符串重叠,则函数的行为是未定义的。

pszFormatpszDest 都不能 NULL。 如果需要处理 NULL 字符串指针值,请使用 RtlStringCbPrintfEx

有关安全字符串函数的详细信息,请参阅 使用安全字符串函数

例子

以下示例演示了使用四个参数 RtlStringCbPrintfW 的基本用法。

int const arraysize = 30;
WCHAR pszDest[arraysize]; 
size_t cbDest = arraysize * sizeof(WCHAR);

LPCWSTR pszFormat = L"%s %d + %d = %d.";
WCHAR* pszTxt = L"The answer is";

NTSTATUS status = RtlStringCbPrintfW(pszDest, cbDest, pszFormat, pszTxt, 1, 2, 3);

生成的字符串是“答案为 1 + 2 = 3”。它包含在 pszDest的缓冲区中。

要求

要求 价值
最低支持的客户端 从 Service Pack 1(SP1)的 Windows XP 开始可用。
目标平台 桌面
标头 ntstrsafe.h (包括 Ntstrsafe.h)
Ntstrsafe.lib
IRQL 如果正在作的字符串始终驻留在内存中,则为任何字符串,否则PASSIVE_LEVEL

另请参阅

RtlStringCbPrintfEx

RtlStringCbVPrintf

RtlStringCchPrintf