C言語編 第8章 文字

先頭へ戻る

この章の概要

この章の概要です。

基本文字集合

C言語のプログラムで使用することができる文字の種類には決まりがあります。そこで、使用できる文字をまとめた文字集合を定義しています。

文字集合は2種類あります。1つは、C言語のソースコード内で使用できる文字を集めたソース文字集合です。もう1つは、C言語のプログラムが実行時に解釈できる文字を集めた実行文字集合です。

「ソースコード内で使用できる文字」という言葉には、変数などの名前(識別子)や return のようなキーワード、コメントに含まれる文字とか、文字列リテラルを構成する文字といったものが諸々含まれています。

ソース文字集合と実行文字集合のどちらでも、必ず使用できる基本的な文字がいくつかあります。そのような文字は、基本文字集合として定義されています。具体的には以下のものが該当します。

図形は種類が多いですが、使う機会が巡ってきたときに把握すれば十分です。別に、今の段階で記憶しなければならない訳ではありません。

垂直タブ書式送りは、ほとんどの人にとって馴染みが無いものだと思います。垂直タブは、水平タブの縦方向版と考えればよく、次の垂直タブ位置まで移動することを意味します。書式送りはいわゆる改ページ操作で、次のページの先頭まで移動します。しかし、このような操作に意味があるかどうかは、出力装置の種類にもよります。

例えば、プリンタでテキストを出力するさまをイメージすると分かりやすいと思います。垂直タブは、印字位置を何行か先にある次の揃え位置へ移動します。書式送りは、ページを変更して、次の紙への印字を始めるという感覚です。この考え方を、画面などのほかの装置への出力に置き換えると、一体どのような意味の操作になるのかは、それぞれの装置の都合で決まることです。

基本文字集合の中には、改行に関する文字がありませんが、ソースファイル内で行の終わりを表現する何らかの方法は必要であるとされています。要するに、Enterキーを押すなどして、行の終わりを指示できれば良いという訳です。

基本文字集合に含まれている文字は、C言語の標準規格に対応した環境なら、どこでも使用できます。基本文字集合に含まれていない文字を使える場合もありますが、そういった文字はほかの環境では使えないかも知れません。

基本文字集合に含まれない、文化圏に応じた文字が使えることがあります。例えば、日本語圏なら、かなや漢字が使えるなどということです。このような文字は、拡張文字と呼ばれています。また、基本文字集合に拡張文字を加えた文字集合を、拡張文字集合と呼びます。

ソース文字集合に含まれているからといって、変数などの名前(識別子)に、どんなふうにでも使えるという訳ではありません。第3章で見た通り、識別子の名前の付け方にはルールがあります。

コンパイラが、追加で幾つかの文字を使ってよいと定めていることがあります。そういう特別な定めがない限り、勝手に新しい文字を追加して使うことは、未定義の動作なので避けなければなりません。ただし、コメントの中とか、文字列リテラルを構成する文字のように、この規定が及ばない場所もあります。

エスケープシーケンス

「\n」が改行を表すのと同じように、「\」に1文字加えて、何か特殊な文字を表現できることがあります。このような表現方法は、エスケープシーケンスと呼ばれています。また、「\」そのものはエスケープ文字と呼ばれます。

C言語には、以下のエスケープシーケンスが存在します。

エスケープシーケンス 意味
\n 改行(位置を次の行に進める)
\r 復帰(位置を現在の行の頭にする)
\f 書式送り(改ページ)
\b 位置を1文字分戻す
\' シングルクォーテーション(')
\" ダブルクォーテーション(")
\? 疑問符(?)
\\ バックスラッシュ(日本語環境では、円マークで表示されることが多い)
\t タブ(水平タブ)
\v 垂直タブ
\a アラート(ベル)
\o (o は 8進数の数字) 8進コードによる文字の表現
\xh (h は 16進数の数字) 16進コードによる文字の表現

現時点で特に知っておくべきなのは、\n、\'、\"、\\、\t といったところでしょう。\r と \o の辺りは、そのうち使う機会が出てきますが、ほかの物はあまり使う機会がありません。

\'、\"、\\ はそれぞれ、「'」「"」「\」といった文字を表すものです。なぜこんなものが必要かというと、「'」「"」「\」には、それぞれ別の用途があるからです。そのため、単に文字としての「'」「"」「\」を使いたいにときには、エスケープシーケンスを使う必要があります。例えば、次のような記述はコンパイルエラーになってしまいます。

puts( "ダブルクォーテーション「"」を出力する。" );

途中にある " が、文字列リテラルの終わりを示しているとみなされてしまうからです。エスケープ文字を補って、次のように書く必要があります。

puts( "ダブルクォーテーション「\"」を出力する。" );

こうすれば、途中の " は、単なる文字としての " とみなされます。

char型

文字を変数で扱うためには、char型の変数を使います。char型の変数は、基本文字集合に含まれるすべての文字を扱うことができます。

char型を使ったサンプルプログラムは次のようになります。

#include <stdio.h>

int main(void)
{
    char c = 'a';

    printf( "%c\n", c );
    
    c = 'x';
    printf( "%c\n", c );

    return 0;
}

実行結果:

a
x

printf関数で char型の値を出力するときは、"%c"変換指定子を使います。scanf関数sscanf関数でも同様で、"%c"変換指定子を使います。

整数の定数を「0」とか「100」などと表記するように、文字定数は、「'a'」とか「'x'」のように、シングルクォーテーション(') で囲んで表記します。こうしないと、変数などの名前と区別ができません。

#include <stdio.h>

int main(void)
{
    char a = 'x';
    char b = a;  /* この a は変数名の a だから、'x' が格納される */

    printf( "%c\n", b );

    return 0;
}

実行結果:

x

なお、エスケープシーケンスは、見た目の上では2文字あるように見えますが、実際には1文字の扱いであり、char型で扱うことができます

#include <stdio.h>

int main(void)
{
    char c = '\n';

    printf( "***%c***\n", c );

    return 0;
}

実行結果:

***
***

文字定数で ' を表現したいときは、エスケープシーケンスを使って「'\''」のようにします。同様に、\ を表現したいときは、「'\\'」とします。

文字定数そのものの型は int型です。文字定数が表現する文字が 1バイトで表現可能な文字であるのならば、char型の変数に代入して使うことができます。そうでないのなら、char型では扱えません。基本文字集合に含まれている文字であれば、必ず 1バイトで表現できます。1バイトで表現できない拡張文字には、wchar_t型(第47章)を使います。


練習問題

問題① 次の文字は基本文字集合に含まれますか?

問題② scanf関数を使って、標準入力から1文字の入力を受け取り、その文字を3つ並べて出力するプログラムを作成して下さい。


解答ページはこちら

参考リンク



更新履歴

'2018/6/15 新規作成。
「エスケープシーケンス」の項は、第2章から持ってきた。



前の章へ(第7章 標準入力②)

次の章へ(第9章 関数)

C言語編のトップページへ

Programming Place Plus のトップページへ


このエントリーをはてなブックマークに追加
rss1.0 取得ボタン RSS