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

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

整数値と文字列の相互変換 - トップページ

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

ここでは整数値と文字列を相互に変換する方法を紹介します。(戻る)

整数値と文字列

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、btolfuncBinToInt
8進文字列から整数値に変換otoi、otolfuncOctToInt
10進文字列から整数値に変換atoi、atolfuncDecToInt
16進文字列から整数値に変換htoi、htolfuncHexToInt
n進文字列から整数値に変換ntoi、ntolfuncStrToInt
n進文字列から整数値に変換(接頭語に対応)stoi、stolfuncStrToIntEx
整数値→文字列
整数値から2進文字列に変換itob、ltobfuncIntToBin
整数値から8進文字列に変換itoo、ltoofuncIntToOct
整数値から10進文字列に変換itoa、ltoafuncIntToHex
整数値から16進文字列に変換itoh、ltohfuncIntToDec
整数値からn進文字列に変換iton、ltonfuncIntToStr
整数値→文字列(出力桁数)
整数値から2進文字列に変換(出力桁数の指定)itos、ltosfuncIntToBinEx
整数値から8進文字列に変換(出力桁数の指定)itos、ltosfuncIntToOctEx
整数値から10進文字列に変換(出力桁数の指定)itos、ltosfuncIntToHexEx
整数値から16進文字列に変換(出力桁数の指定)itos、ltosfuncIntToDecEx
整数値からn進文字列に変換(出力桁数の指定)itos、ltosfuncIntToStrEx

上記のうちで 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 );

目次

サンプル

下記に良く使う 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 と名付ければ良いでしょう。



コメント   この記事についてブログを書く
« アクセラレータのリソース | トップ | 2進文字列と整数値の相互変換 »
最新の画像もっと見る

コメントを投稿

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