itoa
、_itoa
、ltoa
、_ltoa
、、_ultoa
_ui64toa
_ltow
_i64toa
_itow
ultoa
、、 _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
以字元類型單位表示的緩衝區長度。 此參數是從 buffer
C++ 中的 自變數推斷而來。
傳回值
所有這些函式都會傳回 buffer
的指標。 不會傳回錯誤。
備註
、 _ltoa
、 和函_ui64toa
式會將指定value
自變數的位數轉換成以 Null 結尾的字元字串,並將結果儲存在 中buffer
(、、 和 _ultoa
的最多 33 個字元_ltoa
_itoa
,以及 和 65 _i64toa
_ui64toa
個字元)。 _i64toa
_ultoa
_itoa
如果 radix
等於 10 且 value
為負數,則預存字串的第一個字元是減號 (-)。 _itow
、_ltow
、_ultow
、 _i64tow
和 _ui64tow
函式分別是 、_ltoa
、_ultoa
、 _i64toa
和 的_ui64toa
寬字元版本_itoa
。
重要
這些函式可以寫入過太小的緩衝區結尾。 若要防止緩衝區滿溢,請確定 buffer
大小足以保存已轉換的數位加上尾端 Null 字元和正負號字元。 這些函式的誤用可能會導致程式代碼中發生嚴重的安全性問題。
由於安全性問題的潛在原因,這些函式預設會造成取代警告 C4996: 此函式或變數可能不安全。請考慮改用 safe_function
。若要停用取代,請使用 _CRT_SECURE_NO_WARNINGS
。 建議您變更原始碼,以使用 safe_function
警告訊息所建議的 。 更安全的函式不會寫入超過指定緩衝區大小的字元。 如需詳細資訊,請參閱 _itoa_s
、 _itow_s
函式。
若要在沒有取代警告的情況下使用這些函式,請先定義 _CRT_SECURE_NO_WARNINGS
預處理器巨集,再包含任何CRT標頭。 您可以將編譯程式選項新增 /D_CRT_SECURE_NO_WARNINGS
至 cl
命令,以定義它。 否則,請在原始程式檔中定義巨集。 如果您使用先行編譯標頭,請在先行編譯頭頂端定義巨集,包括檔案 pch.h
(stdafx.h
在 Visual Studio 2017 和更早版本中)。 若要在原始碼中定義巨集,請在包含任何CRT標頭之前使用 #define
指示詞,如下列範例所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdlib.h>
在C++中,這些函式具有可叫用其更安全對應專案之範本多載。 如需詳細資訊,請參閱安全範本多載。
根據預設,這些函式的全域狀態會限定於應用程式。 若要變更此行為,請參閱 CRT 中的全域狀態。
POSIX 名稱itoa
、 和 ultoa
會以、ltoa
_ltoa
和 _ultoa
函式的_itoa
別名的形式存在。 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_NONSTDC_NO_WARNINGS
編譯程式選項新增/D_CRT_SECURE_NO_WARNINGS
至 cl
命令,以定義它們。 否則,請在原始程式檔中定義巨集。 如果您使用先行編譯標頭,請在先行編譯頭檔頂端定義巨集。 若要在原始碼中定義巨集,請在包含任何CRT標頭之前使用 #define
指示詞,如下列範例所示:
#define _CRT_NONSTDC_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdlib.h>
最大轉換計數巨集
為了協助您建立轉換的安全緩衝區,CRT 包含一些方便的巨集。 這些巨集會定義轉換每個整數類型之最長可能值所需的緩衝區大小,包括數個常見基底的 Null 終止符和符號字元。 若要確保您的轉換緩衝區夠大,以在 所 radix
指定的基底中接收任何轉換,請在配置緩衝區時,使用其中一個已定義的巨集。 當您將整數類型轉換成字串時,巨集可協助您防止緩衝區滿溢錯誤。 當您在來源中包含 stdlib.h 或 wchar.h 時,會定義這些巨集。
若要在字串轉換函式中使用其中一個巨集,請宣告適當字元類型的轉換緩衝區,並使用整數類型和基底的巨集值作為緩衝區維度。 下表列出適用於所列基底之每個函式的巨集:
函式 | 基數 | 巨集 |
---|---|---|
_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 |
此範例會使用轉換計數巨集來定義足以在 unsigned long long
基底 2 中包含 的緩衝區:
#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)