通常の文字の処理では、1文字では余り役に立たない。普通の文章は、文字が連なって、 一つの情報の固まりとなっている。このように文字が連なったものを、文字列と言う。こ の様な場合、文字型の配列を使うことになる。
このようなことから、文字の状態によって、記憶方法を変える必要がある。これは、プロ グラマーに対して、厳しいことを要求しているが、仕様がそうなっているので仕方ない。 少しだけ、ハードウェアーの知識が必要と言うことである。
ここでは、このような文字をメモリーへの格納方法を示す。
char hoge;型名のcharと言うのは、character(文字)の略である。
この変数に、文字を格納するは簡単で、
hoge = 'A';のよにすればよい。要するに、格納したい文字をシングルクォーテーションで囲んで、代 入演算子(=)を使えばよいのである。
文字型変数のイメージで表を、図1に示す。
表示まで含めた文字型変数を使ったプログラムは、次のようになる。文字型変数を表示さ せるためには、変換指定子%cを用いる。cは、characterの略であろう。
#include <stdio.h> int main(void){ char hoge; /* 文字型の変数 */ hoge='A'; /* 代入 */ printf("%c\n",hoge); /* 表示 */ return 0; }
文字型の配列を使うときには、次のように宣言する。
char hoge[10];これで、10個の文字を格納できるメモリーの領域が確保できる。しかし、実際に入れることができ る文字数は、9文字である。文字列の最後の文字の後に、文字列終了の記号を入れるため、 1文字分少なくなる。文字列終了の記号は、'\0'という文字が使われる。 これは、アスキーコードの0番のNUL4のことである。
いろいろな方法で、この文字型の配列に文字を格納することができる。
hoge[0]='A'; hoge[1]='k'; hoge[2]='i'; hoge[3]='t'; hoge[4]='a'; hoge[5]='\0';実際、この方法で文字を代入することはまれである。文字列のある特定の要素を 操作するには有効である。
strcpy(hoge, "Akita");これで、配列に文字が格納できる。ただ、この方法を使う場合は、プログラムの 最初に#include <string.h>とライブラリーをインクルードする必要がある。
sprintf(hoge, "Akita");printfやfprintf関数とよく似ている。
文字型配列のイメージは、図2のようになる。
表示まで含めた文字型変数を使ったプログラムは、次のようになる。配列に格納された文 字列を表示させるためには、変換指定子%sを用いる。sは、string(ひも、 一続き)の略であろう。
#include <stdio.h> int main(void){ char hoge[10]; /* 文字型の変数 */ sprintf(hoge, "Akita"); /* 代入 */ printf("%s\n",hoge); /* 表示 */ return 0; }
配列のサイズを超えた場合、実際の動作は処理系に依存する。通常は、「segmentation fault」あるいは「セグメンテーション違反です」とかのメッセージを出して、プログラ ムは止まる。
#include <stdio.h> int main(void){ char *hoge; /* 文字型のポインターを用意 */ hoge="Akita"; /* 代入 */ printf("%s\n",hoge); /* 表示 */ return 0; }ポインターについては、2年生で学習するので、ここでは、こんな方法もあるのかという 程度のことで良い。
この問題を解決するために、日本語では2個の文字型のデータ領域に1個の文字を格納して いるのである。なんか、「泥縄式」の解決法に思えるが、実際そうなっているのである。 結構、コンピューターの世界もいい加減である。
実際に、文字型の配列に日本語の文字を格納する方法は、アルファベットとほとんど同じ である。先に示したアルファベットの2番目と3目の方法である次の方法が使える。
strcpy(hoge,"秋田"); sprintf(fuga,"秋田");しかし、hoge[0]='秋';のような代入はできないことには気を付けなくてはならない。 hoge[0]は1バイトで、日本語の「秋」は2バイトだらかである。文字型配列のイメー ジは、図3のようになる。
表示方法もアルファベットと同じである。ただし、変換指定子の%cが使えないこと には注意が必要である。
#include <stdio.h> int main(void){ char hoge[10]; sprintf(hoge, "秋田"); printf("%s\n",hoge); return 0; }