「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;
}

画面を閉じる