「C言語 文字列操作+ファイル入出力 完全制覇」訂正情報

p.75 リスト2-5-3

リスト2-5-3は、プログラムと実行結果が異なっております。掲載プログラムでは、実行結果は次のようになります。

・基数を指定して変換する
 2進数11001010  = 202
10進数01234     = 1234
16進数0x456a    = 17770
20進数a1        = 201
36進数XYZ       = 44027

・基数を指定せず変換する
11001010        = 11001010
01234   = 668
0x456a  = 17770
a1      = 0     [a1]
XYZ     = 0     [XYZ]

 オーバーフローする場合strerror()によりメッセージを表示する

FEDCBA654321 = 2147483647 LONG_MAX = 2147483647
Result too large

また、「pringf("%2d進数 [中略] ,n, pe);」についても、peを表示するようになっていません。以下のプログラムと差し替えてください。

#include <stdio.h>
#include <string.h> // strerror()
#include <stdlib.h>
#include <limits.h> // LONG_MAX が定義されている
int main( void )
{
    char *str[] = { "11001010", "01234", "0x456a", "a1", "XYZ" };
    int base[ 5 ] = { 2, 10, 16, 20, 36 };
    char *err = "FEDCBA654321";
    char *pe;
    int i, n;
    printf( "基数を指定して変換する\n" );
    for ( i = 0; i < 5; i ++ )
    {
        n = strtol( str[ i ], &pe, base[ i ] );
        printf( "%2d進数%s\t= %d\t変換した文字数=%d\n", base[ i ], str[ i ], n, ( pe-str[i] ) );
    }
    printf( "\n基数を指定せず変換する\n" );
    for ( i = 0; i < 5; i ++ )
    {
        n = strtol( str[ i ], &pe, 0 );
        if ( pe[ 0 ] == '\0' )
            printf( "%s\t= %d\n", str[ i ], n );
    else
        printf( "%s\t= %d\t[%s]\n", str[ i ], n, pe ); // 変換中断の場合
    }

    printf( "\nオーバーフローする場合strerror()によりメッセージを表示する\n" );
    printf( "LONG_MAX = %d\n", LONG_MAX );
    printf( "LONG_MIN = %d\n", LONG_MIN );
    n = strtol( err, &pe, 16 );
    printf( "%s\n", strerror( errno ) );

    return 0;
}

peに関しては、以下のように、アドレスの引き算によって、変換に参照された文字数を表示するようにしました。

printf( "%2d進数%s\t= %d\t変換した文字数=%d\n", base[ i ], str[ i ], n, ( pe-str[i] ) );

実行結果は以下のようになります。

基数を指定して変換する
 2進数11001010  = 202   変換した文字数=8
10進数01234     = 1234  変換した文字数=5
16進数0x456a    = 17770 変換した文字数=6
20進数a1        = 201   変換した文字数=2
36進数XYZ       = 44027 変換した文字数=3

基数を指定せず変換する
11001010        = 11001010
01234   = 668
0x456a  = 17770
a1      = 0     [a1]
XYZ     = 0     [XYZ]

オーバーフローする場合strerror()によりメッセージを表示する
LONG_MAX = 2147483647
LONG_MIN = -2147483648
FEDCBA654321 = 2147483647

画面を閉じる