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

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

10進文字列と整数値の相互変換

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

10進文字列と整数値の相互変換を紹介します。(戻る)

アルゴリズム

ここでは10進数の文字列と整数値の相互変換する関数を3つ紹介してます。
文字列から整数値に変換する場合は、文字列の先頭から[0]~[9]の文字を解読してきます。
桁上がりは普通に10倍します。

整数値から文字列に変換する場合は、整数値の下位桁から[0]~[9]の余りを解読してきます。
余りは普通に10で割って求めます。(%演算)
この余りから[0]~[9]の文字に変換して文字列バッファ(lpBuff)にコピーします。
しかし、このままでは文字列が左右反転してるので戻すために左右並びを反転させます。

このときに出力桁数分だけスペース文字などを文字列バッファ(lpBuff)にコピーします。
こうすることで文字列バッファ(lpBuff)の先頭に出力桁数に見合うスペース文字で埋められます。
なお、スペース文字の代わりに[0]の文字で埋めたり、接頭語(0d)もコピーするように改良も可能です。

接頭語(0d)を出力するときには[d][0]の順にコピーしたり、出力桁数から2文字分だけ引いた残りが
スペース文字(ゼロ文字)で埋める出力桁数になることに気をつけましょう。
今回は接頭語(0d)は出力しません。

//------------------------------------------------
// 関数のプロトタイプ宣言
//------------------------------------------------
extern   UINT funcDecToInt( LPCTSTR lpString );
extern LPTSTR funcIntToDec( LPTSTR lpBuff, UINT nValue );
extern LPTSTR funcIntToDecEx( LPTSTR lpBuff, UINT nValue, LONG nWidth, TCHAR tcSpace );

サンプル

//------------------------------------------------------------------------------
// 10進文字列と整数値の相互変換
//------------------------------------------------------------------------------
#include <stdio.h>
#include <tchar.h>
#include <ctype.h>
#include <wctype.h>
#include <locale.h>
#include <Windows.h>

//------------------------------------------------
// 10進文字列から整数値に変換
//------------------------------------------------
extern UINT funcDecToInt( LPCTSTR lpString )
{
    UINT nRet;
    
    for ( nRet = 0 ; _istdigit(*lpString) ; lpString++ ){
        nRet *= 10;
        nRet += (*lpString - TEXT('0'));
    }
    return nRet;
}

//------------------------------------------------
// 文字列の左右並びを反転
//------------------------------------------------
static VOID funcStrReverse( LPTSTR lpHead, LPTSTR lpTail )
{
    TCHAR tcSwap[ 1 ];
    
    for ( *lpTail-- = TEXT('\0') ; lpHead < lpTail ; lpHead++, lpTail-- ){
        tcSwap[ 0 ] = lpHead[ 0 ];
        lpHead[ 0 ] = lpTail[ 0 ];
        lpTail[ 0 ] = tcSwap[ 0 ];
    }
}

//------------------------------------------------
// 整数値から10進文字列に変換
//------------------------------------------------
extern LPTSTR funcIntToDec( LPTSTR lpBuff, UINT nValue )
{
    LPTSTR lpTail;
    
    if ( nValue == 0 ){
        lpBuff[0] = TEXT('0');
        lpBuff[1] = TEXT('\0');
        return lpBuff;
    }
    for ( lpTail = lpBuff ; nValue ; nValue /= 10 ){
        *lpTail++ = ((nValue % 10) + TEXT('0'));
    }
    funcStrReverse( lpBuff, lpTail );
    return lpBuff;
}

//------------------------------------------------
// 文字列の左右並びを反転
//------------------------------------------------
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桁10進文字列に変換
//------------------------------------------------
extern LPTSTR funcIntToDecEx( LPTSTR lpBuff, UINT nValue, LONG nWidth, TCHAR tcSpace )
{
    LPTSTR lpTail = lpBuff;
    
    if ( nValue == 0 ){
        nWidth--; *lpTail++ = TEXT('0');
    }
    else for ( ; nValue ; nValue /= 10 ){
        nWidth--; *lpTail++ = ((nValue % 10) + TEXT('0'));
    }
    funcStrReverseEx( lpBuff, lpTail, nWidth, tcSpace );
    return lpBuff;
}

//------------------------------------------------
// メイン関数
//------------------------------------------------
int _tmain( void )
{
    LPCTSTR     lpDec1 = TEXT("123456789");
    LPCTSTR     lpDec2 = TEXT("0d123456789");
    TCHAR       szBuff[ 256 ];
    LONG        nValue;
    LONG        nWidth = 8;
    TCHAR       tcSpace = TEXT('0');
    
    // ロケールの設定
    _tsetlocale( LC_ALL, TEXT("") );
    // 文字列→整数値
    _tprintf( TEXT("\n// 10進文字列から整数値に変換\n") );
    _tprintf( TEXT("%12s = %ld\n"), lpDec1, funcDecToInt(lpDec1) );
    _tprintf( TEXT("%12s = %ld\n"), lpDec2, funcDecToInt(lpDec2) );
    // 整数値→文字列
    _tprintf( TEXT("\n// 整数値から10進文字列に変換\n") );
    for ( nValue = 0 ; nValue < 32 ; nValue++ ){
        _tprintf( TEXT("%2ld = [%s]\n"), nValue, funcIntToDec(szBuff,nValue) );
    }
    // 整数値→文字列(n桁)
    _tprintf( TEXT("\n// 整数値から10進文字列に変換\n") );
    for ( nValue = 0 ; nValue < 32 ; nValue++ ){
        _tprintf( TEXT("%2ld = [%s]\n"), nValue, funcIntToDecEx(szBuff,nValue,nWidth,tcSpace) );
    }
    return 0;
}

//------------------------------------------------------------------------------
// End of funcDecToInt.cpp
//------------------------------------------------------------------------------

実行結果

// 10進文字列から整数値に変換
   123456789 = 123456789
 0d123456789 = 0

// 整数値から10進文字列に変換
 0 = [0]
 1 = [1]
 2 = [2]
 3 = [3]
 4 = [4]
 5 = [5]
 6 = [6]
 7 = [7]
 8 = [8]
 9 = [9]
10 = [10]
11 = [11]
12 = [12]
13 = [13]
14 = [14]
15 = [15]
16 = [16]
17 = [17]
18 = [18]
19 = [19]
20 = [20]
21 = [21]
22 = [22]
23 = [23]
24 = [24]
25 = [25]
26 = [26]
27 = [27]
28 = [28]
29 = [29]
30 = [30]
31 = [31]

// 整数値から10進文字列に変換
 0 = [00000000]
 1 = [00000001]
 2 = [00000002]
 3 = [00000003]
 4 = [00000004]
 5 = [00000005]
 6 = [00000006]
 7 = [00000007]
 8 = [00000008]
 9 = [00000009]
10 = [00000010]
11 = [00000011]
12 = [00000012]
13 = [00000013]
14 = [00000014]
15 = [00000015]
16 = [00000016]
17 = [00000017]
18 = [00000018]
19 = [00000019]
20 = [00000020]
21 = [00000021]
22 = [00000022]
23 = [00000023]
24 = [00000024]
25 = [00000025]
26 = [00000026]
27 = [00000027]
28 = [00000028]
29 = [00000029]
30 = [00000030]
31 = [00000031]
  • funcDecToInt 関数は接頭語(0d)を解釈しないので付けると 0 になります。(仕様)
  • funcIntToDec 関数は単純に整数値から10進文字列に変換してます。
  • funcIntToDecEx 関数は出力桁数と出力文字を指定して10進文字列に変換してます。
    実はこの関数が本命で funcIntToDec 関数は理解しやすいように載せたものです。
←前へ] [目次] [次へ→

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

コメントを投稿

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