ページ 11

文字コード

Posted: 2011年1月17日(月) 19:47
by イズミ 
今勉強している「明解C言語 中級偏」という本でわからないことがあったので質問させていただきます。

本のサンプルコードに
#include <ctype.h>
#include <stdio.h>
#include <limits.h>
int main(void)
{
int i;

for(i=0;i<=CHAR_MAX;i++){
switch(i){
case '\a': printf("\\a"); break;
case '\b': printf("\\b"); break;
case '\f': printf("\\f"); break;
case '\n': printf("\\n"); break;
case '\r': printf("\\r"); break;
case '\t': printf("\\t"); break;
case '\v': printf("\\v"); break;
default : printf(" %c",isprint(i) ?i: ' ');
}
printf(" %02x\n",i);
}
return 0;
}


というコードがあり、「char型で表現できるすべての文字とコードを16進数で表示するプログラム」らしいのですが、
int 型の変数iを宣言して、for文でCHAR_MAX(255)までインクリメントしていくというのはわかるのですが、for文の中にあるswitch文の意味がまったくわかりません。
変数iが\aや\bなどになるはずが無いのになぜ、\aや\bが表示されるのでしょうか?
よろしくお願いします。

Re: 文字コード

Posted: 2011年1月17日(月) 20:01
by softya(ソフト屋)
それは、制御文字ですね。
http://mikeneko.creator.club.ne.jp/~lab ... ncode.html
0x00~x1fの間にある特殊な意味のある文字コードの事です。

C言語では、エスケープシーケンスで書き表します。

Re: 文字コード

Posted: 2011年1月17日(月) 23:12
by ISLe
重箱の隅をつついてすみません。
イズミ  さんが書きました:for文でCHAR_MAX(255)までインクリメントしていくというのはわかるのですが、
CHAR_MAXは255とは限りませんね。
VisualC++は(デフォルトでは)違います。

Re: 文字コード

Posted: 2011年1月18日(火) 13:55
by ゆーずぃ
横からですが、softyaさんの補足をさせて頂きます。
softya(ソフト屋) さんが書きました:それは、制御文字ですね。
http://mikeneko.creator.club.ne.jp/~lab ... ncode.html
0x00~x1fの間にある特殊な意味のある文字コードの事です。

C言語では、エスケープシーケンスで書き表します。
んで、なぜにエスケープシーケンスだけ特別扱いしているのかというと、
例えば'/t'をそのままprintfの%cとして渡すと、エスケープシーケンスとして扱われてしまうからです。
つまりが「/t 0xhoge」として表示させたいのに、「 0xhoge」のように、/tがそのままタブとして機能してしまうのです。
なので、通常の文字はそのまま印刷し、エスケープシーケンスが出たら手動で'//'(これもエスケープシーケンスで、/を表示させるもの)
を先に入れてやり、その後にそれぞれの文字を追加することによって"/t"という文字列を作り出しているのです。

的外れだったら申し訳ない。

Re: 文字コード

Posted: 2011年1月19日(水) 23:07
by イズミ
皆さん回答ありがとうございました。

自分のC言語の実力もまだまだだということがわかりました。
これからもこのサイトにはちょくちょくお世話になると思いますが、そのときはまたよろしくお願いいたします。