ここでは整数値と文字列を相互に変換する方法を紹介します。(戻る)
整数値と文字列
C言語(C++)では、標準関数で文字列から整数値に変換する atoi、atol、strtol、strtoul の4つが用意されてます。
また、整数値から文字列に変換する方法として sprintf、vsprintf 系の関数で8進/10進/16進文字列に変換できます。
しかし Windows プログラミングを行ってると UNICODE 文字セットに対応した相互変換関数(API)が多くありません。
とりあえず次の7つの API 関数は知ってます。
- StrToInt
- StrToIntEx
- StrToInt64Ex
- wsprintf
- wvsprintf
- wnsprintf
- wvnsprintf
上記では 2~36 進文字列から整数値に変換する関数がありません。
他にも sprintf 系は 2 進数への対応がないので不便なことがあったりします。
そこで私は昔からオリジナル・ライブラリを用意して使ってました。
今回はその一部を紹介します。
処理 | C/C++ | Windows |
---|---|---|
文字列→整数値 | ||
2進文字列から整数値に変換 | btoi、btol | funcBinToInt |
8進文字列から整数値に変換 | otoi、otol | funcOctToInt |
10進文字列から整数値に変換 | atoi、atol | funcDecToInt |
16進文字列から整数値に変換 | htoi、htol | funcHexToInt |
n進文字列から整数値に変換 | ntoi、ntol | funcStrToInt |
n進文字列から整数値に変換(接頭語に対応) | stoi、stol | funcStrToIntEx |
整数値→文字列 | ||
整数値から2進文字列に変換 | itob、ltob | funcIntToBin |
整数値から8進文字列に変換 | itoo、ltoo | funcIntToOct |
整数値から10進文字列に変換 | itoa、ltoa | funcIntToHex |
整数値から16進文字列に変換 | itoh、ltoh | funcIntToDec |
整数値からn進文字列に変換 | iton、lton | funcIntToStr |
整数値→文字列(出力桁数) | ||
整数値から2進文字列に変換(出力桁数の指定) | itos、ltos | funcIntToBinEx |
整数値から8進文字列に変換(出力桁数の指定) | itos、ltos | funcIntToOctEx |
整数値から10進文字列に変換(出力桁数の指定) | itos、ltos | funcIntToHexEx |
整数値から16進文字列に変換(出力桁数の指定) | itos、ltos | funcIntToDecEx |
整数値からn進文字列に変換(出力桁数の指定) | itos、ltos | funcIntToStrEx |
上記のうちで Windows 用のタイプを公開します。
C/C++ 用は Windows 用のデータ型を修正すれば基本的にすべて再現できます。
関数名も統一化してるので使いやすいと思います。
関数のプロトタイプ宣言
//------------------------------------------------ // 文字列から整数値に変換 //------------------------------------------------ extern UINT funcBinToInt( LPCTSTR lpString ); extern UINT funcOctToInt( LPCTSTR lpString ); extern UINT funcHexToInt( LPCTSTR lpString ); extern UINT funcDecToInt( LPCTSTR lpString ); extern UINT funcStrToInt( LPCTSTR lpString, UINT nRadix ); extern UINT funcStrToIntEx( LPCTSTR lpString, UINT nRadix );
//------------------------------------------------ // 整数値からn進文字列に変換 //------------------------------------------------ extern LPTSTR funcIntToBin( LPTSTR lpBuff, UINT nValue ); extern LPTSTR funcIntToOct( LPTSTR lpBuff, UINT nValue ); extern LPTSTR funcIntToHex( LPTSTR lpBuff, UINT nValue ); extern LPTSTR funcIntToDec( LPTSTR lpBuff, UINT nValue ); extern LPTSTR funcIntToStr( LPTSTR lpBuff, UINT nValue, LONG nRadix );
//------------------------------------------------ // 整数値からn進文字列に変換(出力桁数) //------------------------------------------------ extern LPTSTR funcIntToBinEx( LPTSTR lpBuff, UINT nValue, LONG nWidth, TCHAR tcSpace ); extern LPTSTR funcIntToOctEx( LPTSTR lpBuff, UINT nValue, LONG nWidth, TCHAR tcSpace ); extern LPTSTR funcIntToHexEx( LPTSTR lpBuff, UINT nValue, LONG nWidth, TCHAR tcSpace ); extern LPTSTR funcIntToDecEx( LPTSTR lpBuff, UINT nValue, LONG nWidth, TCHAR tcSpace ); extern LPTSTR funcIntToStrEx( LPTSTR lpBuff, UINT nValue, LONG nWidth, TCHAR tcSpace, LONG nRadix );
目次
- 2進文字列と整数値の相互変換 (funcBinToInt、funcIntToBin、funcIntToBinEx)
- 8進文字列と整数値の相互変換 (funcOctToInt、funcIntToOct、funcIntToOctEx)
- 10進文字列と整数値の相互変換 (funcHexToInt、funcIntToHex、funcIntToHexEx)
- 16進文字列と整数値の相互変換 (funcDecToInt、funcIntToDec、funcIntToDecEx)
- n進文字列と整数値の相互変換 (funcStrToInt、funcStrToIntEx、funcIntToStr、funcIntToStrEx)
- 文字列から整数値に変換(まとめ)
- 整数値から文字列に変換(まとめ)
- 整数値からn桁文字列に変換(まとめ)
サンプル
下記に良く使う funcStrToInt、funcStrToIntEx、funcIntToStrEx の3つだけ載せます。
//------------------------------------------------------------------------------ // n進文字列と整数値の相互変換 //------------------------------------------------------------------------------ #include <tchar.h> #include <ctype.h> #include <wctype.h> #include <Windows.h> //------------------------------------------------ // break 付きのキーワード //------------------------------------------------ #define CASE break;case #define DEFAULT break;default //------------------------------------------------ // n進文字列から整数値に変換 //------------------------------------------------ extern UINT funcStrToInt( LPCTSTR lpString, UINT nRadix ) { UINT nValue; UINT nRet; for ( nRet = 0 ; _istalnum(*lpString) ; lpString++ ){ if ( _istdigit(*lpString) ){ nValue = (*lpString - TEXT('0')); } else if ( _istupper(*lpString) ){ nValue = (*lpString - TEXT('A') + 10); } else{ nValue = (*lpString - TEXT('a') + 10); } if ( nValue >= nRadix ){ break; } nRet *= nRadix; nRet += nValue; } return nRet; } //------------------------------------------------ // 接頭語付き文字列から整数値に変換 //------------------------------------------------ extern UINT funcStrToIntEx( LPCTSTR lpString, UINT nRadix ) { if ( nRadix == 0 ){ if ( *lpString == TEXT('0') ){ switch ( *(++lpString) ){ CASE TEXT('b'): nRadix = 2; CASE TEXT('o'): nRadix = 8; CASE TEXT('d'): nRadix = 10; CASE TEXT('x'): nRadix = 16; DEFAULT: return 0; } return funcStrToInt( (lpString + 1), nRadix ); } return funcStrToInt( lpString, 10 ); } return funcStrToInt( lpString, nRadix ); } /* 0b01 0o01234567 0d0123456789 0x0123456789ABCDEF 123456789 */ //------------------------------------------------ // 文字列の左右並びを反転 //------------------------------------------------ static VOID funcStrReverseEx( LPTSTR lpHead, LPTSTR lpTail, LONG nWidth, TCHAR tcSpace ) { TCHAR tcSwap[ 1 ]; while ( nWidth > 0 ){ nWidth--; *lpTail++ = tcSpace; } for ( *lpTail-- = TEXT('\0') ; lpHead < lpTail ; lpHead++, lpTail-- ){ tcSwap[ 0 ] = lpHead[ 0 ]; lpHead[ 0 ] = lpTail[ 0 ]; lpTail[ 0 ] = tcSwap[ 0 ]; } } //------------------------------------------------ // 整数値からn桁n進文字列に変換 //------------------------------------------------ extern LPTSTR funcIntToStrEx( LPTSTR lpBuff, UINT nValue, LONG nWidth, TCHAR tcSpace, LONG nRadix ) { LPTSTR lpTable; LPTSTR lpTail = lpBuff; if ( nRadix < 0 ){ nRadix = -nRadix; lpTable = TEXT("0123456789abcdefghijklmnopqrstuvwxyz"); } else{ lpTable = TEXT("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"); } if ( nValue == 0 ){ nWidth--; *lpTail++ = TEXT('0'); } else for ( ; nValue ; nValue /= nRadix ){ nWidth--; *lpTail++ = lpTable[ nValue % nRadix ]; } funcStrReverseEx( lpBuff, lpTail, nWidth, tcSpace ); return lpBuff; } //------------------------------------------------------------------------------ // End of funcSample.cpp //------------------------------------------------------------------------------
- n進文字列から整数値に変換(funcStrToInt)
- 接頭語付き文字列から整数値に変換(funcStrToIntEx)
- 整数値からn桁n進文字列に変換(funcIntToStrEx)
基本的に上記の3つあれば整数値と文字列の相互変換は困りません。
なお、整数値から文字列に変換する funcIntToStrEx を拡張することで3桁区切りのカンマ文字を挿入する関数も用意できます。
関数名は分かりやすく funcStrComma と名付ければ良いでしょう。
※コメント投稿者のブログIDはブログ作成者のみに通知されます