3 文字の記憶方法

文字をコンピューターのメモリーに格納させるためには、その文字が持つ情報量を考えな くてはならない。先に述べたように、1文字記憶するためには英数字では1バイト、日本語 では2バイトが必要である。これは、記憶させるための箱(変数)の大きさが、日本語では 英語の2倍必要と言うことである。

通常の文字の処理では、1文字では余り役に立たない。普通の文章は、文字が連なって、 一つの情報の固まりとなっている。このように文字が連なったものを、文字列と言う。こ の様な場合、文字型の配列を使うことになる。

このようなことから、文字の状態によって、記憶方法を変える必要がある。これは、プロ グラマーに対して、厳しいことを要求しているが、仕様がそうなっているので仕方ない。 少しだけ、ハードウェアーの知識が必要と言うことである。

ここでは、このような文字をメモリーへの格納方法を示す。

3.1 英数字1文字の場合(文字型変数)

英数字1文字の場合、これは単純で文字型変数を用いる。次のように宣言をすれば、変数 名hogeの文字を入れる入れ物が用意される。この入れ物の容量は、1バイトである。
	char hoge;
型名のcharと言うのは、character(文字)の略である。

この変数に、文字を格納するは簡単で、

	hoge = 'A';
のよにすればよい。要するに、格納したい文字をシングルクォーテーションで囲んで、代 入演算子(=)を使えばよいのである。

文字型変数のイメージで表を、図1に示す。

図 1: 文字型変数hogeを用意して、それに'A'を格納。この箱の大きさは、1バ イトなので、日本語を入れることはできない。
\includegraphics[keepaspectratio, scale=1.0]{figure/char_hoge.eps}

表示まで含めた文字型変数を使ったプログラムは、次のようになる。文字型変数を表示さ せるためには、変換指定子%cを用いる。cは、characterの略であろう。

	#include <stdio.h>
	int main(void){
	  char hoge;             /* 文字型の変数 */
	  hoge='A';              /* 代入 */                 
	  printf("%c\n",hoge);   /* 表示 */
	  return 0;
	}

3.2 英数字の文字列の場合(文字型配列)

3.2.1 文字型配列の使い方

次に、いくつかの英数字で構成される文字列の場合である。このようなときは、文字型の 配列のデータ構造を使う。以前、同じ型の数値データが複数ある場合、int型あるいは double型の配列を使ったのと同じである。

文字型の配列を使うときには、次のように宣言する。

	char hoge[10];
これで、10個の文字を格納できるメモリーの領域が確保できる。しかし、実際に入れることができ る文字数は、9文字である。文字列の最後の文字の後に、文字列終了の記号を入れるため、 1文字分少なくなる。文字列終了の記号は、'\0'という文字が使われる。 これは、アスキーコードの0番のNUL4のことである。

いろいろな方法で、この文字型の配列に文字を格納することができる。

教科書に載っている方法と、私が使う方法を示したが、これ以外の方法も存在するであろ う。3番目の方法がお勧めであるので、これはしっかり憶えるように。

文字型配列のイメージは、図2のようになる。

図 2: 文字型の配列hoge[10]を用意して、それに"Akita"を格納。一つの箱には、 一つの英数字しか入れられない。そして、最後に\0が入る。
\includegraphics[keepaspectratio, scale=1.0]{figure/char_dim_hoge.eps}

表示まで含めた文字型変数を使ったプログラムは、次のようになる。配列に格納された文 字列を表示させるためには、変換指定子%sを用いる。sは、string(ひも、 一続き)の略であろう。

	
	#include <stdio.h>
	int main(void){
	  char hoge[10];             /* 文字型の変数 */
	  sprintf(hoge, "Akita");    /* 代入 */
	  printf("%s\n",hoge);       /* 表示 */
	return 0;
	}

3.2.2 注意

配列を使い場合、そのサイズはプログラマーが決めなくてはならない。そのサイズを超え て、代入をするような操作をすると、エラーメッセージを出して止まる。あるいは、コン ピューターがクラッシュすることもあり得る。従って、通常プログラムを作成するときに は、十分大きい配列を用意するのが普通である。

配列のサイズを超えた場合、実際の動作は処理系に依存する。通常は、「segmentation fault」あるいは「セグメンテーション違反です」とかのメッセージを出して、プログラ ムは止まる。

3.2.3 ポインターを使う方法

最後に余談であるが、ポインターというものを使えば、次のようなこともできる。
	#include <stdio.h>
	int main(void){
	  char *hoge;            /* 文字型のポインターを用意 */
	  hoge="Akita";          /* 代入 */                 
	  printf("%s\n",hoge);   /* 表示 */
	  return 0;
	}
ポインターについては、2年生で学習するので、ここでは、こんな方法もあるのかという 程度のことで良い。

3.3 日本語の場合

3.3.1 文字型配列の使い方

文字型の場合、それに格納できるデータは1バイトである。一方、日本語の場合、文字は2 バイトで表現する。文字型が2バイトであれば問題ないのであるが、コンピューターを発 展させたのが米国であるため、仕様は1バイトになってしまった。そこで、日本語を扱う 場合、少しばかり考えなくてはならない。

この問題を解決するために、日本語では2個の文字型のデータ領域に1個の文字を格納して いるのである。なんか、「泥縄式」の解決法に思えるが、実際そうなっているのである。 結構、コンピューターの世界もいい加減である。

実際に、文字型の配列に日本語の文字を格納する方法は、アルファベットとほとんど同じ である。先に示したアルファベットの2番目と3目の方法である次の方法が使える。

  strcpy(hoge,"秋田");
  sprintf(fuga,"秋田");
しかし、hoge[0]='秋';のような代入はできないことには気を付けなくてはならない。 hoge[0]は1バイトで、日本語の「秋」は2バイトだらかである。文字型配列のイメー ジは、図3のようになる。
図 3: 文字型の配列hoge[10]を用意して、それに"秋田"を格納。日本語の場合、 2つの箱で1つの文字が入る。そして、最後に\0が入る。
\includegraphics[keepaspectratio, scale=1.0]{figure/char_kanji_hoge.eps}

表示方法もアルファベットと同じである。ただし、変換指定子の%cが使えないこと には注意が必要である。

	#include <stdio.h>
	int main(void){
	  char hoge[10];
	  sprintf(hoge, "秋田");
	  printf("%s\n",hoge);
	  return 0;
	}

3.3.2 注意

ここでも、配列を使うため、そのサイズに気を付ける必要がある。アルファベット同様、 余裕を持って、配列を確保しなくてはならない。ただ、アルファベットと異なり、文字数 の2倍と、文字列の終わりを示す\0が格納できるサイズが必要である。
ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成16年12月14日


no counter