今勉強している「明解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が表示されるのでしょうか?
よろしくお願いします。
文字コード
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 文字コード
それは、制御文字ですね。
http://mikeneko.creator.club.ne.jp/~lab ... ncode.html
0x00~x1fの間にある特殊な意味のある文字コードの事です。
C言語では、エスケープシーケンスで書き表します。
http://mikeneko.creator.club.ne.jp/~lab ... ncode.html
0x00~x1fの間にある特殊な意味のある文字コードの事です。
C言語では、エスケープシーケンスで書き表します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 文字コード
重箱の隅をつついてすみません。
VisualC++は(デフォルトでは)違います。
CHAR_MAXは255とは限りませんね。イズミ さんが書きました:for文でCHAR_MAX(255)までインクリメントしていくというのはわかるのですが、
VisualC++は(デフォルトでは)違います。
Re: 文字コード
横からですが、softyaさんの補足をさせて頂きます。
例えば'/t'をそのままprintfの%cとして渡すと、エスケープシーケンスとして扱われてしまうからです。
つまりが「/t 0xhoge」として表示させたいのに、「 0xhoge」のように、/tがそのままタブとして機能してしまうのです。
なので、通常の文字はそのまま印刷し、エスケープシーケンスが出たら手動で'//'(これもエスケープシーケンスで、/を表示させるもの)
を先に入れてやり、その後にそれぞれの文字を追加することによって"/t"という文字列を作り出しているのです。
的外れだったら申し訳ない。
んで、なぜにエスケープシーケンスだけ特別扱いしているのかというと、softya(ソフト屋) さんが書きました:それは、制御文字ですね。
http://mikeneko.creator.club.ne.jp/~lab ... ncode.html
0x00~x1fの間にある特殊な意味のある文字コードの事です。
C言語では、エスケープシーケンスで書き表します。
例えば'/t'をそのままprintfの%cとして渡すと、エスケープシーケンスとして扱われてしまうからです。
つまりが「/t 0xhoge」として表示させたいのに、「 0xhoge」のように、/tがそのままタブとして機能してしまうのです。
なので、通常の文字はそのまま印刷し、エスケープシーケンスが出たら手動で'//'(これもエスケープシーケンスで、/を表示させるもの)
を先に入れてやり、その後にそれぞれの文字を追加することによって"/t"という文字列を作り出しているのです。
的外れだったら申し訳ない。