「文字型データ」

文字型データ

文字型(char型)は「文字」を表現するためにC言語に用意された基本デー タ型の一つである。 整数型(int型)と同様にある一定の範囲にある整数値を表現するための 型であり、通常は8ビットで表現できる範囲の整数値を扱える。
整数値を格納するのであれば、何故int型を使わないのか?という疑問も湧く であろうが、それはメモリの消費を抑えるためである。 演習で使用しているwindows PCでは、通常int型は4バイト(32ビット)のサイズ であるが、1文字(1バイトで十分)を表現するために4バイト使うのは無駄が多い。 そのため、1バイトの整数値を扱うデータ型「文字型(char型)」を使用するわ けである。

char c;

c = 'A';
上の例では、char型の変数cを宣言し、'A'(文字'A')を値として 設定している。
ここで、'A'は文字定数である。
文字定数は文字型の定数で、「'」(シングルクォート)で文字を囲む ことで表現する。

拡張表記(エスケープシーケンス)

'A'や'z'のような通常の文字の他に拡張表記(エスケープシーケンス) と呼ぶものが存在する。 例えば、今までに使ってきたprintf()でメッセージを表示する際に、"Hello World\n"のように'\n'という表記があったと思うが、これも拡張表記の一つである。 ('\n'は改行を意味する) '\n'のように、「\」(バックスラッシュ。windowsでは円マークとして表示さ れる)で始まる形式を拡張表記と呼ぶ。

文字定数として「'」(シングルクォート)を記述したい場合に、 下記のようにしたのでは、文法エラーになる。 (文字定数を「'」(シングルクォート)で囲むため、文字定数のつもりの「'」 (シングルクォート)が文字定数を囲むための「'」(シングルクォート)と解釈 されるためである)

char c = ''';    /* 文法エラー */
文字定数として「'」(シングルクォート)を記述したい場合は、拡張表記を使っ て'\''とする。
char c = '\'';    /* OK */
後で説明する文字列定数でも同様の問題があり、その場合は「"」(ダブルクォー ト)を拡張表記として表現する。
char string[] = "I said \"you are right.\"";    /* "を含む文字列の場合 */

拡張表記には以下のようなものが存在する。(一部を紹介する)

\n    改行 (new line)
\t    水平タブ (horizontal tab)
\v    垂直タブ (vertical tab)
\b    バックスペース (backspace)
\a    アラート (alert) 
\'    シングルクォート
\"    ダブルクォート
\\    バックスラッシュ(windowsでは円マーク)
\?    疑問符

以下のサンプルコードは1文字ずつ表示する プログラムである。

#include <stdio.h>

int
main(void)
{
    putchar('A');     /* 'A' */
    putchar('\t');    /* 水平タブ */
    putchar('\'');    /* シングルクォート */
    putchar('x');     /* 'x' */
    putchar('\'');    /* シングルクォート */
    putchar('\t');    /* 水平タブ */
    putchar('B');     /* 'B' */
    putchar('\n');    /* 改行 */
}

実行結果は以下のようになる。 水平タブ(文字の間の空白部分)やシングルクォートが表示されている。

A       'x'     B

  ※ 空白部分は水平タブ

文字コード

全ての文字にはそれぞれ固有の整数値が割り当てられており、 これを文字コードと呼ぶ。 コードの割り当て方法は無数に考えられるが、各々が独自の割り当て法を使っ ていたのでは、情報の交換の際に障害となるため、標準となる割り当て法が定 められている。 現在一般に使われているのはASCII (American Standard Code for Information Interchange) コードと呼ばれるもので、以下のようなコード表となっている。
(他にも大型計算機などで使用されているEBCDICなどがあるが、ここでは扱わない)

ASCII code character table
     (0 〜 31および127は制御文字)
     32 ' '     33 '!'     34 '"'     35 '#'     36 '$'     37 '%'     38 '&'     39 '''    
     40 '('     41 ')'     42 '*'     43 '+'     44 ','     45 '-'     46 '.'     47 '/'    
     48 '0'     49 '1'     50 '2'     51 '3'     52 '4'     53 '5'     54 '6'     55 '7'    
     56 '8'     57 '9'     58 ':'     59 ';'     60 '<'     61 '='     62 '>'     63 '?'    
     64 '@'     65 'A'     66 'B'     67 'C'     68 'D'     69 'E'     70 'F'     71 'G'    
     72 'H'     73 'I'     74 'J'     75 'K'     76 'L'     77 'M'     78 'N'     79 'O'    
     80 'P'     81 'Q'     82 'R'     83 'S'     84 'T'     85 'U'     86 'V'     87 'W'    
     88 'X'     89 'Y'     90 'Z'     91 '['     92 '\'     93 ']'     94 '^'     95 '_'    
     96 '`'     97 'a'     98 'b'     99 'c'    100 'd'    101 'e'    102 'f'    103 'g'    
    104 'h'    105 'i'    106 'j'    107 'k'    108 'l'    109 'm'    110 'n'    111 'o'    
    112 'p'    113 'q'    114 'r'    115 's'    116 't'    117 'u'    118 'v'    119 'w'    
    120 'x'    121 'y'    122 'z'    123 '{'    124 '|'    125 '}'    126 '~'
0番から31番までと127番は制御文字と呼ばれ、通常の文字とは扱いが異なる。 (文字として表示されない)
48番から57番までは数字、65番から90番までがアルファベットの大文字、 97番から122番までがアルファベットの小文字に割り当てられている。
例えば、アルファベットの'B'は66番、数字の'9'は57番になっており、 'B' == 66であり、'9' == 57と同じ意味である。

以下の プログラムによりASCIIコードの文字一覧が確認できる。

#include <stdio.h>

int
main(void)
{
    int i, j;

    printf("ASCII code character table\n");
    for (i = 4; i < 16; i++) {
	for (j = 0; j < 8; j++)
	    printf("%3d '%c'  ", i*8+j, i*8+j);
	printf("\n");
    }
}

ASCIIコードはアルファベットや数字などの7ビットで表現できる範囲の文字の みを扱ったコード体系であり、日本語で使用する漢字などの文字は含まれない。 日本語などの文字を扱うには、最低2バイト必要となるため、C言語のchar型で は表現できない。 日本語を扱える文字コード体系としては、JISコード、シフトJISコード、 日本語EUCコードが存在し、どれも2バイトで1文字を表現する。

他にも日本語以外の中国語、韓国語など全ての言語で使用する文字を統一的に 扱うことを目的に考えられたUnicodeがある。

文字から数値への変換

入力した数字(文字の一種)を数値に変換したい場合があるが、 C言語では、例えば以下のようにすることで、数字を整数の値に変換することが出来る。
int v = '8' - '0';    /* 文字'8'が整数値8になる */
先に説明したASCIIコード表を見ると、数字('0'〜'9')はひとつづきになって いることが分かる。 これを利用して、数字('0'(文字コード48)〜'9'(文字コード57))から'0'(文字 コード48)を引くことで、数字を0〜9の整数の値とすることが出来る。

以下のサンプルプログラムは入力した文字が数 字だった場合に整数の値に変換するプログラムである。

#include <stdio.h>

int
main(void)
{
    int v = 0;
    int c;

    printf("input number=");

    while ((c = getchar()) != EOF) {
	if (c >= '0' && c <= '9')
	    v = v*10 + (c - '0');            /* 1桁ずつ計算 */
	else
	    break;
    }


/* 次で紹介するライブラリ関数を使って
   ↓このように書くことも出来る

    while ((c = getchar()) != EOF) {
	if (isdigit(c))                      /* isdigit()で数字を判定 */
	    v = v*10 + (c - '0');            /* 1桁ずつ計算 */
	else
	    break;
    }
*/


    printf("v=%d\n", v);
}
上記のサンプルプログラムを実行すると以下の出力結果となる。 (斜字体部分はユーザの入力)
input number=124
v=124

文字型データ操作ライブラリ関数 ctype.h

C言語の標準ライブラリには文字型データを扱うためのライブラリ関数が用意 されている。 以下はその一部である。 これらの関数は ctype.hをインクルードすることで使用可能となる。
(他にもいろいろと便利な関数があるので、Visual C++のヘルプを使って調べ てみるとよい)

以下にこららの関数の使用例を示す。

#include <ctype.h>    /* ctype.hをインクルード */
#include <stdio.h>

void
check_char(char c)
{
    printf("check '%c'\n", c);

    if (isalpha(c)) {    /* アルファベットかどうか */
	printf("'%c' is alphabet\n", c);
    }
    if (isdigit(c)) {    /* 数字かどうか */
	printf("'%c' is digit char\n", c);
    }
    if (isupper(c)) {    /* 大文字かどうか */
	printf("'%c' is uppercase char\n", c);
	printf("lowercase of '%c' is '%c'\n", c, tolower(c));
    }
    if (islower(c)) {    /* 小文字かどうか */
	printf("'%c' is lowercase char\n", c);
	printf("uppercase of '%c' is '%c'\n", c, toupper(c));
    }
    if (isspace(c)) {    /* 空白文字かどうか */
	printf("'%c' is white space\n", c);
    }

    printf("\n");
}

int
main(void)
{
    int c;

    printf("input character=");
    c = getchar();    /* 1文字入力 */
    check_char(c);    /* 入力した文字をチェック */
}
上記のサンプルプログラムを実行すると以下の出力結果となる。 (斜字体部分はユーザの入力)

('a'を入力した場合)
input character=a
check 'a'
'a' is alphabet
'a' is lowercase char
uppercase of 'a' is 'A'


('B'を入力した場合)
input character=B
check 'B'
'B' is alphabet
'B' is uppercase char
lowercase of 'B' is 'b'


('7'を入力した場合)
input character=7
check '7'
'7' is digit char


(' '(スペース)を入力した場合)
input character= 
check ' '
' ' is white space

文字型データ入出力ライブラリ関数

文字型データの入出力として以下の関数が用意されている。
これらの関数は stdio.hをインクルードすることで使用可能となる。

以下の サンプルコードは入力した文字を大文字にして出力するプログラムである。
入力した文字をint型の変数cに格納している。 これは上で説明した通り、EOFを区別するためである。

#include <stdio.h>
#include <ctype.h>

int
main(void)
{
    int c;
    while ((c = getchar()) != EOF)    /* 入力が終わるまでループ */
	putchar(toupper(c));         /* 大文字にして出力 */
}
上記のサンプルプログラムを実行すると以下の出力結果となる。
1行入力後エンターキーを叩くと入力した文章を大文字にして出力する。
(プログラムの終了はCtrl-Z(windowsの場合)を押して入力を終了するか、 Ctrl-Cを押して強制終了する)
a quick brown fox jumps over the lazy dog.
A QUICK BROWN FOX JUMPS OVER THE LAZY DOG.

文責:大津