プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

文字列から整数値に変換(まとめ)

2012年04月22日 10時18分06秒 | アルゴリズム関連

文字列から整数値に変換する関数群をまとめたページです。(戻る)

アルゴリズム

ここでは文字列から整数値に変換するすべての関数(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
←前へ] [目次] [次へ→

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« n進文字列と整数値の相互変換 | トップ | 整数値から文字列に変換(まとめ) »
最新の画像もっと見る

コメントを投稿

アルゴリズム関連」カテゴリの最新記事