itoa
、、_itoa
、_ltoa
ltoa
、ultoa
、_ultoa
_itow
_ui64toa
_ltow
_i64toa
、_ultow
、、 _i64tow
_ui64tow
将整数转换为字符串。 可使用这些函数的更安全版本,详见 _itoa_s
、_itow_s
函数。
语法
char * _itoa( int value, char *buffer, int radix );
char * _ltoa( long value, char *buffer, int radix );
char * _ultoa( unsigned long value, char *buffer, int radix );
char * _i64toa( long long value, char *buffer, int radix );
char * _ui64toa( unsigned long long value, char *buffer, int radix );
wchar_t * _itow( int value, wchar_t *buffer, int radix );
wchar_t * _ltow( long value, wchar_t *buffer, int radix );
wchar_t * _ultow( unsigned long value, wchar_t *buffer, int radix );
wchar_t * _i64tow( long long value, wchar_t *buffer, int radix );
wchar_t * _ui64tow( unsigned long long value, wchar_t *buffer, int radix );
// These POSIX versions of the functions have deprecated names:
char * itoa( int value, char *buffer, int radix );
char * ltoa( long value, char *buffer, int radix );
char * ultoa( unsigned long value, char *buffer, int radix );
// The following template functions are C++ only:
template <size_t size>
char *_itoa( int value, char (&buffer)[size], int radix );
template <size_t size>
char *_itoa( long value, char (&buffer)[size], int radix );
template <size_t size>
char *_itoa( unsigned long value, char (&buffer)[size], int radix );
template <size_t size>
char *_i64toa( long long value, char (&buffer)[size], int radix );
template <size_t size>
char * _ui64toa( unsigned long long value, char (&buffer)[size], int radix );
template <size_t size>
wchar_t * _itow( int value, wchar_t (&buffer)[size], int radix );
template <size_t size>
wchar_t * _ltow( long value, wchar_t (&buffer)[size], int radix );
template <size_t size>
wchar_t * _ultow( unsigned long value, wchar_t (&buffer)[size], int radix );
template <size_t size>
wchar_t * _i64tow( long long value, wchar_t (&buffer)[size], int radix );
template <size_t size>
wchar_t * _ui64tow( unsigned long long value, wchar_t (&buffer)[size],
int radix );
参数
value
要转换的数字。
buffer
保存转换结果的缓冲区。
radix
基数,将用于转换 value
,必须在 2-36 的范围内。
size
缓冲区长度,以字符类型为单位。 此参数是从 C++ 中的 buffer
参数推断出来的。
返回值
这些函数均返回指向 buffer
的指针。 无错误返回。
备注
_itoa
、_ltoa
、_ultoa
、_i64toa
和 _ui64toa
函数会将给定 value
参数的数字转换为以 null 结尾的字符串并将结果(_itoa
、_ltoa
和 _ultoa
最多 33 个字符,_i64toa
和 _ui64toa
最多 65 个字符)存储在 buffer
中。 如果 radix
等于 10 且 value
为负,则存储字符串的第一个字符为减号 (-)。 _itow
、_ltow
、_ultow
、_i64tow
和 _ui64tow
函数分别是 _itoa
、_ltoa
、_ultoa
、_i64toa
和 _ui64toa
的宽字符版本。
重要
这些函数可能会在写入时超出过小的缓冲区的界限。 若要防止缓冲区溢出,请确保 buffer
的大小足以保存转换的位数及尾随的 Null 字符和符号字符。 滥用这些函数可能会导致代码中出现严重的安全问题。
由于可能存在安全问题,默认情况下,这些函数会导致出现弃用警告 C4996:此函数或变量可能不安全。请考虑改用 safe_function
。若要禁用弃用,请使用 _CRT_SECURE_NO_WARNINGS
。建议更改源代码以使用警告消息建议的 safe_function
。 更安全的函数不会写入比指定的缓冲区大小更多的字符。 有关详细信息,请参阅 _itoa_s
、_itow_s
函数。
若要在不使用弃用警告的情况下使用这些函数,请在包括任何 CRT 标头之前定义 _CRT_SECURE_NO_WARNINGS
预处理器宏。 可以通过将 /D_CRT_SECURE_NO_WARNINGS
编译器选项添加到 cl
命令来定义它。 否则在源文件中定义宏。 如果使用预编译标头,请在预编译标头 include 文件 pch.h
(在 Visual Studio 2017 及更低版本中为 stdafx.h
)的顶部定义宏。 若要在源代码中定义宏,请在包括任何 CRT 标头之前使用 #define
指令,如以下示例所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdlib.h>
在 C++ 中,这些函数具有模板重载,可调用更安全的版本。 有关详细信息,请参阅安全模板重载。
默认情况下,这些函数的全局状态范围限定为应用程序。 若要更改此行为,请参阅 CRT 中的全局状态。
POSIX 名称 itoa
、ltoa
和 ultoa
作为 _itoa
、_ltoa
和 _ultoa
函数的别名存在。 POSIX 名称已弃用,因为它们不遵循 ISO C 的特定于实现的全局函数名称约定。默认情况下,这些函数会导致弃用警告 C4996: 此项目的 POSIX 名称已弃用。请改用 ISO C 和C++一致性名称: new_name
。 建议更改源代码以使用函数 _itoa_s
、_ltoa_s
或 _ultoa_s
的更安全版本。 有关详细信息,请参阅 _itoa_s
、_itow_s
函数。
为了源代码可移植性,可以首选在代码中保留 POSIX 名称。 若要在不使用弃用警告的情况下使用这些函数,请在包括任何 CRT 标头之前定义 _CRT_NONSTDC_NO_WARNINGS
和 _CRT_SECURE_NO_WARNINGS
预处理器宏。 可以通过将 /D_CRT_SECURE_NO_WARNINGS
和 /D_CRT_NONSTDC_NO_WARNINGS
编译器选项添加到 cl
命令来定义它们。 否则在源文件中定义宏。 如果使用预编译标头,请在预编译标头 include 文件的顶部定义宏。 若要在源代码中定义宏,请在包括任何 CRT 标头之前使用 #define
指令,如以下示例所示:
#define _CRT_NONSTDC_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdlib.h>
最大转换计数宏
为了帮助你创建用于转换的安全缓冲区,CRT 包含了一些很方便的宏。 这些宏定义为多个常见基数转换每个整数类型的最长可能值(包括 null 终止符和符号字符)所需的缓冲区大小。 若要确保转换缓冲区足够大,可以在 radix
指定的基数中接收任何转换,请在分配缓冲区时使用这些定义的宏之一。 这些宏有助于防止在将整型类型转换为字符串时出现缓冲区溢出错误。 这些宏是在源中包括 stdlib.h 或 wchar.h 时定义的。
若要在字符串转换函数中使用其中一个宏,请声明相应的字符类型的转换缓冲区,并将整数类型和基数的宏值用作缓冲区维度。 下表列出了每个适用于列出的基数的函数的宏:
函数 | radix | 宏 |
---|---|---|
_itoa , _itow |
16 10 8 2 |
_MAX_ITOSTR_BASE16_COUNT _MAX_ITOSTR_BASE10_COUNT _MAX_ITOSTR_BASE8_COUNT _MAX_ITOSTR_BASE2_COUNT |
_ltoa , _ltow |
16 10 8 2 |
_MAX_LTOSTR_BASE16_COUNT _MAX_LTOSTR_BASE10_COUNT _MAX_LTOSTR_BASE8_COUNT _MAX_LTOSTR_BASE2_COUNT |
_ultoa , _ultow |
16 10 8 2 |
_MAX_ULTOSTR_BASE16_COUNT _MAX_ULTOSTR_BASE10_COUNT _MAX_ULTOSTR_BASE8_COUNT _MAX_ULTOSTR_BASE2_COUNT |
_i64toa , _i64tow |
16 10 8 2 |
_MAX_I64TOSTR_BASE16_COUNT _MAX_I64TOSTR_BASE10_COUNT _MAX_I64TOSTR_BASE8_COUNT _MAX_I64TOSTR_BASE2_COUNT |
_ui64toa , _ui64tow |
16 10 8 2 |
_MAX_U64TOSTR_BASE16_COUNT _MAX_U64TOSTR_BASE10_COUNT _MAX_U64TOSTR_BASE8_COUNT _MAX_U64TOSTR_BASE2_COUNT |
此示例使用一个转换计数宏来定义一个缓冲区,该缓冲区大到足以包含以 2 为基数的 unsigned long long
:
#include <wchar.h>
#include <iostream>
int main()
{
wchar_t buffer[_MAX_U64TOSTR_BASE2_COUNT];
std:wcout << _ui64tow(0xFFFFFFFFFFFFFFFFull, buffer, 2) << std::endl;
}
一般文本例程映射
Tchar.h 例程 |
_UNICODE 和 _MBCS 未定义 |
_MBCS 已定义 |
_UNICODE 已定义 |
---|---|---|---|
_itot |
_itoa |
_itoa |
_itow |
_ltot |
_ltoa |
_ltoa |
_ltow |
_ultot |
_ultoa |
_ultoa |
_ultow |
_i64tot |
_i64toa |
_i64toa |
_i64tow |
_ui64tot |
_ui64toa |
_ui64toa |
_ui64tow |
要求
例程 | 必需的标头 |
---|---|
itoa 、 ltoa 、、 ultoa |
<stdlib.h> |
_itoa 、、_ltoa _ultoa 、_i64toa 、_ui64toa |
<stdlib.h> |
_itow 、、_ltow _ultow 、_i64tow 、_ui64tow |
<stdlib.h> 或 <wchar.h> |
这些函数和宏是 Microsoft 特定函数和宏。 有关兼容性的详细信息,请参阅 兼容性。
示例
此示例演示如何使用某些整数转换函数。 请注意,使用 _CRT_SECURE_NO_WARNINGS
宏可抑制警告 C4996。
// crt_itoa.c
// Compile by using: cl /W4 crt_itoa.c
// This program makes use of the _itoa functions
// in various examples.
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h> // for printf
#include <string.h> // for strnlen
#include <stdlib.h> // for _countof, _itoa fns, _MAX_COUNT macros
int main(void)
{
char buffer[_MAX_U64TOSTR_BASE2_COUNT];
int r;
for (r = 10; r >= 2; --r)
{
_itoa(-1, buffer, r);
printf("base %d: %s (%d chars)\n", r, buffer,
strnlen(buffer, _countof(buffer)));
}
printf("\n");
for (r = 10; r >= 2; --r)
{
_i64toa(-1LL, buffer, r);
printf("base %d: %s (%d chars)\n", r, buffer,
strnlen(buffer, _countof(buffer)));
}
printf("\n");
for (r = 10; r >= 2; --r)
{
_ui64toa(0xffffffffffffffffULL, buffer, r);
printf("base %d: %s (%d chars)\n", r, buffer,
strnlen(buffer, _countof(buffer)));
}
}
base 10: -1 (2 chars)
base 9: 12068657453 (11 chars)
base 8: 37777777777 (11 chars)
base 7: 211301422353 (12 chars)
base 6: 1550104015503 (13 chars)
base 5: 32244002423140 (14 chars)
base 4: 3333333333333333 (16 chars)
base 3: 102002022201221111210 (21 chars)
base 2: 11111111111111111111111111111111 (32 chars)
base 10: -1 (2 chars)
base 9: 145808576354216723756 (21 chars)
base 8: 1777777777777777777777 (22 chars)
base 7: 45012021522523134134601 (23 chars)
base 6: 3520522010102100444244423 (25 chars)
base 5: 2214220303114400424121122430 (28 chars)
base 4: 33333333333333333333333333333333 (32 chars)
base 3: 11112220022122120101211020120210210211220 (41 chars)
base 2: 1111111111111111111111111111111111111111111111111111111111111111 (64 chars)
base 10: 18446744073709551615 (20 chars)
base 9: 145808576354216723756 (21 chars)
base 8: 1777777777777777777777 (22 chars)
base 7: 45012021522523134134601 (23 chars)
base 6: 3520522010102100444244423 (25 chars)
base 5: 2214220303114400424121122430 (28 chars)
base 4: 33333333333333333333333333333333 (32 chars)
base 3: 11112220022122120101211020120210210211220 (41 chars)
base 2: 1111111111111111111111111111111111111111111111111111111111111111 (64 chars)