「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