文字関数の引数に char 型変数を渡すと、関数が期待するとおりに動作しない場合がある。 //********************************************************* // 引数値が 0x00 〜 0xFF の範囲であれば真を、さもなくば偽を返す。 //********************************************************* int is_char( int c ) { return ( c >= 0 ) && ( c <= 0xFF ); }//is_char //********************************************************* // 文字関数引数の動作確認 //********************************************************* int main( void ) { #define LINEWIDTH 0x1F // LINEWIDTH 毎に改行 int i; char c; puts( "引数に char 型変数を渡した場合:" ); for( i=c=0; i <= 0xFF; c = (char)++i ) { if ( 0==(i&LINEWIDTH) ) printf( "0x%02x: ", i ); printf( "%s%s", (is_char(c) ? "○" : "×"), ((LINEWIDTH == (i & LINEWIDTH)) ? "\n" : "") ); } puts(""); puts( "unsigned char に変換した場合:" ); for( i=c=0; i <= 0xFF; c = (char)++i ) { if ( 0==(i&LINEWIDTH) ) printf( "0x%02x: ", i ); printf( "%s%s", (is_char((unsigned char)c) ? "○" : "×"), ((LINEWIDTH == (i & LINEWIDTH)) ? "\n" : "") ); } return 0; #undef LINEWIDTH // #define LINEWIDTH }//main 実行結果引数に char 型変数を渡した場合: 0x00: ○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○ 0x20: ○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○ 0x40: ○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○ 0x60: ○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○ 0x80: ×××××××××××××××××××××××××××××××× 0xa0: ×××××××××××××××××××××××××××××××× 0xc0: ×××××××××××××××××××××××××××××××× 0xe0: ×××××××××××××××××××××××××××××××× unsigned char に変換した場合: 0x00: ○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○ 0x20: ○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○ 0x40: ○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○ 0x60: ○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○ 0x80: ○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○ 0xa0: ○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○ 0xc0: ○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○ 0xe0: ○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○ 関連
・printf, fprintf, sprintf 使用上の注意 |
|