lesson2 (update:2018/9/27 )


補足問題


[ prev | index ]

補足問題 漢字コードの16進表示  

使っている計算機の上で、入力された漢字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」と出力される*/

[目次]


[ prev | index ]