使っている計算機の上で、入力された漢字1文字(2バイト)の文字コードを16進整数4桁として出力するプログラム を作る。
入力: 漢字1文字
出力: 「○」の漢字コードは○○○○です。
期待する実行例
水 <<入力 「水」の漢字コードは 9085です <<出力
この例では「水」を入力としたが、作成するプログラムではどのような漢字が入力されても、それに応じた出力を行うこと。
この問題をヒントなしで作れたら、すばらしい。自信が有るなら挑戦してみよう。
ヒント:
1) 1バイトを変数に読み込んでそのまま書き出すプログラム
#include<stdio.h> int main(void) { unsigned char c;/*ここはcharにすると符号付となる場合がある*/ scanf("%c",&c);/* scanfの使い方忘れてませんか?*/ printf("%c",c); return 0; }
※ 1バイトをchar型の変数に読み込むときは符号無し型(unsigned char)にすること。
[難しい理屈?] printfに引数が渡されるとき、char型はint型に拡張して渡される。ここでchar型の値が16進数で「90」の様な符号付char型では負の値の場合、負の整数に変換されて16進数で「FFFFFF90」と8桁の数になってしまう。この結果としてprintfの書式指定で桁数を2桁と指定しても無視されて8桁の表示となる。
※ 漢字は2バイトで構成されるので2回読み込んで2回書き出す必要が有る。変数も2個必要になるでしょう。
まずは2個の変数に1バイトづつ読み込んでそのまま2バイト書き出すプログラムを作ってみましょう。
1*) 1バイトの読み取りにgetchar関数を使うと初めからint型の変数に読み込めます。このときには値は0-255の範囲になる。上記の様なchar型からint型への変換で生じる問題を回避できます。
#include<stdio.h> int main(void) { int c;/*ここはint型にする*/ c=getchar();/* getcharは正常な読み込みでは0〜255のint型の値を戻す*/ printf("%c",c); return 0; }
2) 変数の値を16進数の文字列として書き出す場合の書式指定子は%X
さらに0を補って2桁にする場合は%02X
printf("十進数%dを16進2桁で表すと%02X",10,10); /*これで「十進数10を16進2桁で表すと0A」と出力される*/
[目次]