vsnprintf、_vsnprintf、_vsnprintf_l、_vsnwprintf、_vsnwprintf_l

编写使用指针参数列表的格式化输出。 提供这些函数的更多安全版本;请参见 vsnprintf_s、_vsnprintf_s、_vsnprintf_s_l、_vsnwprintf_s、_vsnwprintf_s_l

int vsnprintf(
   char *buffer,
   size_t count,
   const char *format,
   va_list argptr 
);
int _vsnprintf(
   char *buffer,
   size_t count,
   const char *format,
   va_list argptr 
);
int _vsnprintf_l(
   char *buffer,
   size_t count,
   const char *format,
   locale_t locale,
   va_list argptr 
);
int _vsnwprintf(
   wchar_t *buffer,
   size_t count,
   const wchar_t *format,
   va_list argptr 
);
int _vsnwprintf_l(
   wchar_t *buffer,
   size_t count,
   const wchar_t *format,
   locale_t locale,
   va_list argptr 
);
template <size_t size>
int vsnprintf(
   char (&buffer)[size],
   size_t count,
   const char *format,
   va_list argptr 
); // C++ only
template <size_t size>
int _vsnprintf(
   char (&buffer)[size],
   size_t count,
   const char *format,
   va_list argptr 
); // C++ only
template <size_t size>
int _vsnprintf_l(
   char (&buffer)[size],
   size_t count,
   const char *format,
   locale_t locale,
   va_list argptr 
); // C++ only
template <size_t size>
int _vsnwprintf(
   wchar_t (&buffer)[size],
   size_t count,
   const wchar_t *format,
   va_list argptr 
); // C++ only
template <size_t size>
int _vsnwprintf_l(
   wchar_t (&buffer)[size],
   size_t count,
   const wchar_t *format,
   locale_t locale,
   va_list argptr 
); // C++ only

参数

  • buffer
    输出的存储位置。

  • count
    可写的最多字符数。

  • format
    格式规范。

  • argptr
    指向参数列表的指针。

  • locale
    要使用的区域设置。

有关更多信息,请参见格式规范

返回值

vsnprintf、_vsnprintf和 _vsnwprintf 返回的字符的数量,则编写字符的数目小于或等于 count;如果编写的字符数大于 count,这些函数返回 -1 指示输出被截断。 如果一种编写,返回值不包括终止 null。

如果buffer 或 format 是NULL,或数目小于等于零,这些函数将调用无效参数处理程序, 正如参数验证所述。 如果允许执行继续,则这些函数返回 -1 并将 errno 设置为 EINVAL。

备注

这些功能中的每一个采用指向参数列表的指针,然后布局和编写特定数据到count 字符由 buffer指向的内存。 如果末尾有空间 (即,如果编写字符的数目小于 count),将缓冲区以 null 结尾。

安全说明安全说明

确保 format 不是用户定义的字符串。有关更多信息,请参见避免缓冲区溢出

备注

为了确保具有终止 null 的空间,请确保 count 大于缓冲区长度严格小于缓冲区并在调用函数之前 null。

vsnprintf 等同于 _vsnprintf。 vsnprintf 对于符合包括 ANSI 标准 _vnsprintf 用于保留向后兼容性。

这些带有 _l 后缀的函数的版本相同,只不过它们使用传递的区域设置参数而不是当前线程区域设置。

在 C++ 中,这些函数具有模板重载,以调用这些函数的更新、更安全副本。 有关更多信息,请参见安全模板重载

一般文本例程映射

TCHAR.H 例程

未定义的 _UNICODE & 和 _MBCS

已定义 _MBCS

已定义 _UNICODE

_vsntprintf

_vsnprintf

_vsnprintf

_vsnwprintf

_vsntprintf_l

_vsnprintf_l

_vsnprintf_l

_vsnwprintf_l

要求

例程

必需的标头

可选标头

vsnprintf

<stdio.h> 和 <stdarg.h>

<varargs.h>*

_vsnprintf, _vsnprintf_l

<stdio.h> 和 <stdarg.h>

<varargs.h>*

_vsnwprintf, _vsnwprintf_l

<stdio.h> 或 <wchar.h> 和 <stdarg.h>

<varargs.h>*

* 仅对 UNIX V 兼容性是必需的。

有关其他兼容性信息,请参见“简介”中的兼容性

示例

// crt_vsnprintf.cpp
// compile with: /W3
#include <stdio.h>
#include <wtypes.h>

void FormatOutput(LPCSTR formatstring, ...) 
{
   int nSize = 0;
   char buff[10];
   memset(buff, 0, sizeof(buff));
   va_list args;
   va_start(args, formatstring);
   nSize = vsnprintf( buff, sizeof(buff) - 1, formatstring, args); // C4996
// Note: vsnprintf is deprecated; consider vsnprintf_s instead
   printf("nSize: %d, buff: %s\n", nSize, buff);
}

int main() {
   FormatOutput("%s %s", "Hi", "there");
   FormatOutput("%s %s", "Hi", "there!");
   FormatOutput("%s %s", "Hi", "there!!");
}
  

.NET Framework 等效项

不适用。若要调用标准 C 函数,请使用 PInvoke。有关更多信息,请参见平台调用示例

请参见

参考

流 I/O

vprintf 函数

格式规范语法:printf 和 wprintf 函数

fprintf、_fprintf_l、fwprintf、_fwprintf_l

printf、_printf_l、wprintf、_wprintf_l

sprintf、_sprintf_l、swprintf、_swprintf_l、__swprintf_l

va_arg、va_copy、va_end、va_start