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

p.178 リスト5-3-9

リスト5-3-9のListDump関数の修正(<---のところを修正・追加してください)

int LineDump( FILE *ifp, FILE *ofp )
{
    unsigned char    strbuf[ BUF_SIZE + 2 ];    // <--- charをunsigned charに変更
    int c, i, j;                                // <--- int宣言でjを追加
    for ( i = 0; i < BUF_SIZE; i ++ )
    {
        c = fgetc( ifp );
        if ( c == EOF )     break;
        fprintf( ofp, "%02x ", c );
        strbuf[ i ] = c;
    }
    if ( isKanji1( c ) )                /* 最後が漢字1バイト目なら  */
    {
        int c2 = fgetc( ifp );          /* 次の1バイトも読込む      */
        if ( isKanji2( c2 ) )           /* 漢字2バイト目なら保存する*/
            strbuf[ i ] = c2;
        ungetc( c2, ifp );              /* ストリームに返す         */
        i ++;
    }
    strbuf[ i ] = '\0';

    for ( j = 0; j < i; j ++ )          /* 表示できない文字を置き換える */
    {
        if ( isspace( strbuf[ j ] ) )           // <--- <--- cをstrbuf[ j ]とし、元の行を2つに分けました
            strbuf[ j ] = ' ';                  // <--- 空白文字の場合は,バッファ上のデータをスペースに変更
        else if ( isKanji1( strbuf[ j ] ) && isKanji2( strbuf[ j + 1 ] ))
            j ++;
        else if ( ! isprint( strbuf[ j ] ) )    /* 表示できないコードは'.'にする */
            strbuf[ j ] = '.';
    }
    for ( ; i < BUF_SIZE; i ++ )
        fprintf( ofp, "-- " );
    fprintf( ofp, "  %s\n", strbuf );

    return c;
}

画面を閉じる