sprintf、

您所在的位置:网站首页 sprintf漏洞 sprintf、

sprintf、

#sprintf、| 来源: 网络整理| 查看: 265

sprintf, _sprintf_l, swprintf, _swprintf, _swprintf_l, __swprintf_l 项目 03/10/2023

将设置格式的数据写入字符串。 提供这些函数的更安全版本;请参阅 sprintf_s、_sprintf_s_l、swprintf_s、_swprintf_s_l。 swprintf 和 _swprintf_l 的安全版本以缓冲区的大小作为参数。

语法 int sprintf( char *buffer, const char *format [, argument] ... ); int _sprintf_l( char *buffer, const char *format, _locale_t locale [, argument] ... ); int swprintf( wchar_t *buffer, size_t count, const wchar_t *format [, argument]... ); int _swprintf( wchar_t *buffer, const wchar_t *format [, argument]... ); int _swprintf_l( wchar_t *buffer, size_t count, const wchar_t *format, _locale_t locale [, argument] ... ); int __swprintf_l( wchar_t *buffer, const wchar_t *format, _locale_t locale [, argument] ... ); template int sprintf( char (&buffer)[size], const char *format [, argument] ... ); // C++ only template int _sprintf_l( char (&buffer)[size], const char *format, _locale_t locale [, argument] ... ); // C++ only 参数

buffer 输出的存储位置

count 要存储在 Unicode 版的此函数中的最大字符数。

format 格式控件字符串

argument 可选自变量

locale 要使用的区域设置。

有关详细信息,请参阅 格式规范语法。

返回值

写入的字符数或 -1(如果发生错误)。 如果 buffer 或 format 为空指针,则调用无效参数处理程序,如 参数验证中所述。 如果允许继续执行,则这些函数返回 -1 并将 errno 设置为 EINVAL。

sprintf 返回存储在 buffer中的字节数,不包括终止 null 字符。 swprintf 返回存储在 buffer 中的宽字符数,不包括中止 null 宽字符。

注解

sprintf 函数存储 buffer中的一系列字符和值并设置格式。 每个 argument (如果有)根据 format中相应的格式规范进行转换和输出。 该格式包括普通字符,其形式和函数与 format 的 printf 参数相同。 null 字符追加在写入的最后一个字符后。 如果在重叠的字符串之间发生复制,则此行为不确定。

重要

使用 sprintf,无法限制写入的字符数,这意味着使用 sprintf 的代码容易受到缓冲区溢出的影响。 请考虑使用相关函数 _snprintf,用于指定写入 buffer 的最大字符数,或使用 _scprintf 来确定需要多大的缓冲区。 同样,确保 format 不是用户定义的字符串。

从 Windows 10 版本 2004(内部版本 19041)开始,printf 系列函数根据 IEEE 754 的舍入规则输出可精确表示的浮点数。 在早期的 Windows 版本中,以“5”结尾并且可精确表示的浮点数总是向上取整。 IEEE 754 规定它们必须舍入到最接近的偶数(也称为“四舍六入五成双”)。 例如,printf("%1.0f", 1.5) 和 printf("%1.0f", 2.5) 都应舍入为 2。 之前,1.5 舍入为 2,2.5 舍入为 3。 此更改仅影响可精确表示的数字。 例如,2.35(用于内存表示时更接近于 2.35000000000000008)仍然向上取整为 2.4。 这些函数完成的舍入现在也遵循 fesetround 设置的浮点舍入模式。 以前,舍入始终选择 FE_TONEAREST 行为。 此更改仅影响使用 Visual Studio 2019 版本 16.2 及更高版本生成的程序。 若要使用旧的浮点舍入行为,请链接到 'legacy_stdio_float_rounding.obj`。

swprintf 是 sprintf的宽字符版本; swprintf 的指针参数是宽字符串。 swprintf 中的编码错误检测可能与 sprintf 中的不同。 swprintf 和 fwprintf 的行为相同,只不过 swprintf 将输出写入字符串而不是类型 FILE的目标,并且 swprintf 要求 count 参数指定要写入的最大字符数。 这些带有 _l 后缀的函数的版本相同,只不过它们使用传递的区域设置参数而不是当前线程区域设置。

在 的签名 swprintf 标准化之前,旧版 Microsoft C 运行时库中提供了未采用字符计数参数的版本。 旧版本在 Microsoft C 运行时库中仍然可用,但已弃用并重命名 _swprintf()为 。 对于针对旧签名编写的代码,请定义 _CRT_NON_CONFORMING_SWPRINTFS,它将调用swprintf_swprintf映射到 。 在未来版本中,可能会删除旧行为,因此应将代码更改为使用新的符合标准行为。

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

一般文本例程映射 TCHAR.H 例程 _UNICODE 和 _MBCS 未定义 _MBCS 已定义 _UNICODE 已定义 _stprintf sprintf sprintf _swprintf _stprintf_l _sprintf_l _sprintf_l __swprintf_l 要求 例程所返回的值 必需的标头 sprintf, _sprintf_l swprintf, _swprintf, _swprintf_l 或

有关兼容性的详细信息,请参阅兼容性。

示例:使用 sprintf 格式化数据 // crt_sprintf.c // compile with: /W3 // This program uses sprintf to format various // data and place them in the string named buffer. #include int main( void ) { char buffer[200], s[] = "computer", c = 'l'; int i = 35, j; float fp = 1.7320534f; // Format and print various data: j = sprintf( buffer, " String: %s\n", s ); // C4996 j += sprintf( buffer + j, " Character: %c\n", c ); // C4996 j += sprintf( buffer + j, " Integer: %d\n", i ); // C4996 j += sprintf( buffer + j, " Real: %f\n", fp );// C4996 // Note: sprintf is deprecated; consider using sprintf_s instead printf( "Output:\n%s\ncharacter count = %d\n", buffer, j ); } Output: String: computer Character: l Integer: 35 Real: 1.732053 character count = 79 示例:错误代码处理 // crt_swprintf.c // wide character example // also demonstrates swprintf returning error code #include int main( void ) { wchar_t buf[100]; int len = swprintf( buf, 100, L"%s", L"Hello world" ); printf( "wrote %d characters\n", len ); len = swprintf( buf, 100, L"%s", L"Hello\xffff world" ); // swprintf fails because string contains WEOF (\xffff) printf( "wrote %d characters\n", len ); } wrote 11 characters wrote -1 characters 另请参阅

流 I/O fprintf, _fprintf_l, fwprintf, _fwprintf_l printf, _printf_l, wprintf, _wprintf_l scanf, _scanf_l, wscanf, _wscanf_l sscanf, _sscanf_l, swscanf, _swscanf_l vprintf 函数



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3