RtlStringCchPrintfExA 函数 (ntstrsafe.h)

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

语法

NTSTRSAFEDDI RtlStringCchPrintfExA(
  [out, optional] NTSTRSAFE_PSTR  pszDest,
  [in]            size_t          cchDest,
  [out, optional] NTSTRSAFE_PSTR  *ppszDestEnd,
  [out, optional] size_t          *pcchRemaining,
  [in]            DWORD           dwFlags,
  [in]            NTSTRSAFE_PCSTR pszFormat,
                  ...             
);

参数

[out, optional] pszDest

指向调用方提供的缓冲区的指针,该缓冲区接收格式化的以 null 结尾的字符串。 该函数从 pszFormat 和函数的参数列表提供的格式字符串创建此字符串。 pszDest 指针可以 NULL,但前提是STRSAFE_IGNORE_NULLS在 dwFlags中设置

[in] cchDest

目标缓冲区的大小(以字符为单位)。 缓冲区必须足够大,才能包含格式化字符串和终止 null 字符。 允许的最大字符数是NTSTRSAFE_MAX_CCH。 如果 pszDest为 NULL,则 cchDest 必须为零。

[out, optional] ppszDestEnd

如果调用方提供非NULL 地址指针,则在操作完成后,该函数会加载该地址,其中包含指向目标缓冲区生成的 NULL 字符串终止符的指针。

[out, optional] pcchRemaining

如果调用方提供非NULL 地址指针,则该函数将加载缓冲区中未使用的字符数 pszDest(包括终止 null 字符)的地址。

[in] dwFlags

一个或多个标志,还可以选择填充字节。 标志的定义如下:

价值 意义
STRSAFE_FILL_BEHIND_NULL
如果设置且函数成功,则 dwFlags 的低字节用于填充终止 null 字符之后的目标缓冲区部分。
STRSAFE_IGNORE_NULLS
如果已设置,pszDest pszSrc或两者都可以 NULLNULLpszSrc 指针被视为可以复制的空字符串(TEXT(“”)。 NULLpszDest 指针无法接收无空字符串。
STRSAFE_FILL_ON_FAILURE
如果设置且函数失败,则 dwFlags 的低字节用于填充整个目标缓冲区,缓冲区以 null 结尾。 此操作覆盖任何预先存在的缓冲区内容。
STRSAFE_NULL_ON_FAILURE
如果设置且函数失败,则目标缓冲区将设置为空字符串(TEXT(“”)。 此操作覆盖任何预先存在的缓冲区内容。
STRSAFE_NO_TRUNCATION
如果 set 和函数返回STATUS_BUFFER_OVERFLOW,则不会修改目标缓冲区的内容。

[in] pszFormat

指向以 null 结尾的文本字符串的指针,该字符串包含 printf样式格式设置指令。 pszFormat 指针可以 NULL,但前提是在 dwFlags中设置STRSAFE_IGNORE_NULLS。

...

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

返回值

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

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

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

  • 指定了无效标志。
  • cchDest 中的值大于最大缓冲区大小。
  • 目标缓冲区已满。
  • NULL 指针不存在,没有STRSAFE_IGNORE_NULLS标志。
  • 目标缓冲区指针 NULL,但缓冲区大小不为零。
  • 目标缓冲区指针 NULL,或者其长度为零,但存在非零长度源字符串。

言论

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

  • sprintf
  • swprintf
  • _snprintf
  • _snwprintf
所有这些函数都接受格式字符串和参数列表,并返回格式化字符串。 RtlStringCchPrintfExWRtlStringCchPrintfExA 接受目标缓冲区的大小(以字符为单位)以确保它们不会写入到此缓冲区的末尾。

RtlStringCchPrintfExWRtlStringCchPrintfExA 通过返回指向目标字符串末尾的指针以及该字符串中未使用的字符数,添加到 RtlStringCchPrintf 的功能。 可以将标志传递给函数以获取其他控件。

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

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

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

除非设置了STRSAFE_IGNORE_NULLS标志,否则 pszSrcpszDest 都不能 NULL,在这种情况下,两者都可以 NULL。 如果 pszDestNULLpszSrc 必须 NULL 或指向空字符串。

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

要求

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

另请参阅

RtlStringCbPrintfEx

RtlStringCchPrintf

RtlStringCchVPrintfEx