Share via


itoa, _itoa, ltoa, _ltoa, ultoa, _ultoa, _i64toa, _ui64toa, _itow, _ltow, _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 個字元 _itoa_ltoa ,以及 和 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_WARNINGScl 命令,以定義它。 否則,請在原始程式檔中定義宏。 如果您使用先行編譯標頭,請在先行編譯頭頂端定義宏,包括檔案 pch.hstdafx.h 在 Visual Studio 2017 和更早版本中)。 若要在原始程式碼中定義宏,請在包含任何 CRT 標頭之前使用 #define 指示詞,如下列範例所示:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdlib.h>

在 C++ 中,這些函式具有範本多載,可叫用更安全的對應專案。 如需詳細資訊,請參閱 保護範本多載

根據預設,這些函式的全域狀態會限定于應用程式。 若要變更此行為,請參閱 CRT 中的全域狀態。

POSIX 名稱 itoa 、 和 ultoa 會以 、 _ltoaltoa_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_WARNINGScl 命令,以定義它們。 否則,請在原始程式檔中定義宏。 如果您使用先行編譯標頭,請在先行編譯標頭檔頂端定義宏。 若要在原始程式碼中定義宏,請在包含任何 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)

另請參閱

資料轉換
_itoa_s_itow_s 函式