「C言語 文字列操作+ファイル入出力 完全制覇」訂正情報
p.47 List1-6-2、p48 List1-6-3
この2つのプログラムは、コンパイラによっては正しく動作しません。
sprintf()では、
sprintf( buf, "%s%d,", buf, intAr[ i ] );
のように、コピー先のアドレスとコピー元のアドレスが同じ(ここではbuf)場合の動作は保証されていないとのことです。VisualC++では正常に動作するのですが、コンパイラに依存するようです。
そこで、strcpy()を使って、以下のように修正する必要があります。
char tmp[ 1000 ]; // 一時的に文字列を格納するバッファを用意する sprintf( tmp, "%s%d,", buf, intAr[ i ] ); // 一時バッファに文字列を入れる strcpy( buf, tmp ); // 出力用のバッファにコピーする
プログラムを、次のように修正してください。
◆List1-6-2
#include#include // strcpy()のためのインクルード int main( void ) { char *words[] = { "int", "float", "double", "undigned", "long" }; int i, no = sizeof( words ) / sizeof( char* ); char buffer[ 100 ]; buffer[ 0 ] = '\0'; for ( i = 0; i < no; i ++ ){ char tmp[ 100 ]; // 一時的に文字列を格納するバッファを用意する sprintf( tmp, "%s%8s\n", buffer, words[ i ] );// 一時バッファに文字列を入れる strcpy( buffer, tmp ); // 出力用のバッファにコピーする } printf( buffer ); return 0; }
◆List1-6-3
#include#include // strcpy()のためのインクルード void IntArrayToStr( int intAr[], int no, char *buf ) { int i; buf[ 0 ] = '\0'; for ( i = 0; i < no; i ++ ){ char tmp[ 1000 ]; // 一時的に文字列を格納するバッファを用意する sprintf( tmp, "%s%d,", buf, intAr[ i ] ); // 一時バッファに文字列を入れる strcpy( buf, tmp ); // 出力用のバッファにコピーする } } int main( void ) { int data[] = { 64, 128, 256, 512, 1024, 2048, 4096, 9192 }; int dataNo = sizeof( data ) / sizeof( int ); char buffer[ 1000 ]; IntArrayToStr( data, dataNo, buffer ); printf( buffer ); return 0; }