文字列から整数値に変換する関数群をまとめたページです。(戻る)
アルゴリズム
ここでは文字列から整数値に変換するすべての関数(6個)をまとめて紹介します。
文字列から整数値に変換する場合は、文字列の先頭から[0]~[9]、[A]~[Z]、[a]~[z]の文字を解読してきます。
桁上がりは変換する基数(2、8、10、16)や、引数で指定した nRadix の値をそのまま掛け算します。
基数が2の倍数である 2進数、8進数、16進数は左シフトを使って桁上がり処理を行ってます。
この方がちょっとだけ高速になります。(最新のパソコンでは高速化してるのか良く分からないね)
//------------------------------------------------ // 関数のプロトタイプ宣言 //------------------------------------------------ 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 );
サンプル
//------------------------------------------------------------------------------ // 2進/8進/10進/16進文字列から整数値に変換 //------------------------------------------------------------------------------ #include <stdio.h> #include <tchar.h> #include <ctype.h> #include <wctype.h> #include <locale.h> #include <Windows.h> //------------------------------------------------ // break 付きのキーワード //------------------------------------------------ #define CASE break;case #define DEFAULT break;default //------------------------------------------------ // マクロ関数 //------------------------------------------------ #define funcStrIsBin(s) ((TEXT('0')<=(s)[0]) && ((s)[0]<=TEXT('1'))) #define funcStrIsOct(s) ((TEXT('0')<=(s)[0]) && ((s)[0]<=TEXT('7'))) //------------------------------------------------ // 2進文字列から整数値に変換 //------------------------------------------------ extern UINT funcBinToInt( LPCTSTR lpString ) { UINT nRet; for ( nRet = 0 ; funcStrIsBin(lpString) ; lpString++ ){ nRet <<= 1; nRet |= (*lpString - TEXT('0')); } return nRet; } //------------------------------------------------ // 8進文字列から整数値に変換 //------------------------------------------------ extern UINT funcOctToInt( LPCTSTR lpString ) { UINT nRet; for ( nRet = 0 ; funcStrIsOct(lpString) ; lpString++ ){ nRet <<= 3; nRet |= (*lpString - TEXT('0')); } return nRet; } //------------------------------------------------ // 16進文字列から整数値に変換 //------------------------------------------------ extern UINT funcHexToInt( LPCTSTR lpString ) { UINT nRet; for ( nRet = 0 ; _istxdigit(*lpString) ; lpString++ ){ if ( _istdigit(*lpString) ){ nRet <<= 4; nRet |= (*lpString - TEXT('0')); } else if ( _istupper(*lpString) ){ nRet <<= 4; nRet |= (*lpString - 'A' + 10); } else{ nRet <<= 4; nRet |= (*lpString - 'a' + 10); } } return nRet; } //------------------------------------------------ // 10進文字列から整数値に変換 //------------------------------------------------ extern UINT funcDecToInt( LPCTSTR lpString ) { UINT nRet; for ( nRet = 0 ; _istdigit(*lpString) ; lpString++ ){ nRet *= 10; nRet += (*lpString - TEXT('0')); } return nRet; } //------------------------------------------------ // 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 */ //------------------------------------------------ // メイン関数 //------------------------------------------------ int _tmain( void ) { // 接頭語なし LPCTSTR lpBin1 = TEXT("111010110111100110100010101"); LPCTSTR lpOct1 = TEXT("726746425"); LPCTSTR lpDec1 = TEXT("123456789"); LPCTSTR lpHex1 = TEXT("75BCD15"); // 接頭語あり LPCTSTR lpBin2 = TEXT("0b111010110111100110100010101"); LPCTSTR lpOct2 = TEXT("0o726746425"); LPCTSTR lpDec2 = TEXT("0d123456789"); LPCTSTR lpHex2 = TEXT("0x75BCD15"); _tsetlocale( LC_ALL, TEXT("") ); _tprintf( TEXT("\n// 接頭語なし\n") ); _tprintf( TEXT("%-30s = %ld\n"), lpBin1, funcBinToInt(lpBin1) ); _tprintf( TEXT("%-30s = %ld\n"), lpOct1, funcOctToInt(lpOct1) ); _tprintf( TEXT("%-30s = %ld\n"), lpDec1, funcDecToInt(lpDec1) ); _tprintf( TEXT("%-30s = %ld\n"), lpHex1, funcHexToInt(lpHex1) ); _tprintf( TEXT("\n// 接頭語あり\n") ); _tprintf( TEXT("%-30s = %ld\n"), lpBin2, funcStrToIntEx(lpBin2,0) ); _tprintf( TEXT("%-30s = %ld\n"), lpOct2, funcStrToIntEx(lpOct2,0) ); _tprintf( TEXT("%-30s = %ld\n"), lpDec2, funcStrToIntEx(lpDec2,0) ); _tprintf( TEXT("%-30s = %ld\n"), lpHex2, funcStrToIntEx(lpHex2,0) ); return 0; } //------------------------------------------------------------------------------ // End of funcStrToIntLib.cpp //------------------------------------------------------------------------------
実行結果
// 接頭語なし 111010110111100110100010101 = 123456789 726746425 = 123456789 123456789 = 123456789 75BCD15 = 123456789 // 接頭語あり 0b111010110111100110100010101 = 123456789 0o726746425 = 123456789 0d123456789 = 123456789 0x75BCD15 = 123456789[←前へ] [目次] [次へ→]
※コメント投稿者のブログIDはブログ作成者のみに通知されます