今まで、文字列はそのまま表示させてはいましたが、文字を記憶することは学んでいませんでした。
変数は すべて、 整数値を扱う int のみを使用していました。 今回は、文字の出力や、文字を記憶する変数について学びます。
C言語では、文字は、1つの文字と、文字列に区別されています。また、1文字を記録する変数は用意されていますが、文字列を記憶する変数は用意されていません。
文字列については、前回学んだ、配列を使って文字列を記憶します。
文字の表示を行う
printf関数で文字列を表示することは「文字を画面に表示する」で学びましたが、今回は、出力変換指定子を使用して文字を表示することについて学びます。
出力変換指定子を使用したprintf関数の使い方は「数値や記憶した値を画面に表示する」で学んでいますが、このときは、数値を表示するのみで、文字については学んでいませんでした。
1文字を表示するためには、出力変換指定子に、%cを指定する必要があります。次のように記述します。
printf("文字は、%cです。¥n", 'A');
このprintf関数を実行すると次のように画面に出力されます。
出力結果
文字は、Aです。
1文字を記述するときは、' ' で囲みます。' ' で囲んでも画面には' ' がつかずに出力されます。
文字を入力する
1文字を入力する場合、scanf関数で%cを指定する方法もありますが、今回は、もっとシンプルなgetchar関数を使うこともありますので、これを使用した入力方法について学びます。
getcharを使用する場合は、stdio.hをインクルードする必要があります。
getcharの構文は次のようになります。
構文
変数名 = getchar( );
getchar関数は、scanf関数と同様に標準入力を使用します。getchar関数が実行されると、入力待ち状態となり、標準入力からの入力を待ちます。
文字が入力されると、その入力された1文字を変数名に代入するという動きになります。
getchar関数のサンプルプログラムを次に示します。
#include <stdio.h>
int main(void)
{
char c1, c2;
c1 = getchar();
printf("%c\n", c1);
c2 = getchar();
printf("%c\n", c2);
return 0;
}
A Enterを入力した場合、AB Enterを入力した場合の実行結果を次に示します。
実行結果
A ←入力データ
Aを入力しました。
を入力しました。
getchar関数が実行されて、キー入力待ち状態になります。
次に、A Enterを入力すると、AとEnterが標準入力の場所に記憶され、getchar関数から'A'を返し、c1に代入され、それを表示します。
そして、次のgetchar関数ですが、ここでは、キー入力待ち状態にはなりません。それは、Enterが標準入力の場所に記憶されたままとなっているためです。
その結果、Enterがc2に代入されることになります。Enterを表示していますが、特殊文字のため、%cには何も表示されていないよう見えます。
2回目のprintf文を%dなどに変更して表示してみると数値が表示されることがわかると思います。興味がある方は試してみてください。
実行結果
AB ←入力データ
Aを入力しました。
Bを入力しました。
getchar関数が実行されて、キー入力待ち状態になります。
次に、AB Enterを入力すると、AとBとEnterが標準入力の場所に記憶され、getchar関数から'A'を返し、c1に代入され、それを表示します。
そして、次のgetchar関数ですが、まだ、BとEnterが標準入力の場所に記憶されたままとなっているため、次の'B'がc2に代入されることになり、次のprintf関数では、Bが表示されます。
文字コード
コンピュータの内部では、文字も数値として扱われます。各文字に対応する数値を文字コードをいいます。この文字コードには、シフトJISなど、いろいろな種類があります。環境によってどの文字コードが使われるかが変わります。
先ほどは、' ' で1文字を記述し、画面に出力していましたが、文字コードを指定しても、対応する文字が出力されます。次にサンプルプログラムを示します。
#include <stdio.h>
int main(void)
{
printf("65は、%cです。¥n", 65);
printf("16進数の41は、%cです。¥n", '¥x41');
return 0;
}
5行目では、10進数の数値で記述しました。これを%cで文字にしています。
6行目では、エスケープシーケンスの ¥x を使って、16進数の文字コードを記述しています。普通の数値の65と同じです。
実行結果は、次のようになります。
実行結果
65は、Aです。
16進数の41は、Aです。
このように、数値や文字コードを使用して、1文字を記述することもできます。
文字を扱う変数
C言語では、int 以外にも、いろんな型が用意されています。その中の1つに1文字を記憶できる、char(キャラ)型が用意されています。
1文字とは、半角文字を示します。全角文字を扱うことはできません。
また、文字を変数で扱う場合も、1文字を表示するには、 %c を使用します。
1文字を表示するサンプルプログラムを次に示します。
#include <stdio.h>
int main(void)
{
char c;
c = 'A';
printf("%c¥n", c);
return 0;
}
実行結果は、次のようになります。
実行結果
A
このように、1文字を扱うには、char型の変数を用意し、そこに、' 'で囲んだ1文字を代入する。そして、表示するには、%c 指定子を使用するだけです。
' ' を付けて代入していますが、画面に出力するときは、 文字を変数で扱う場合も、' ' はつかないで出力されます。
文字を計算する
char型の変数もint型と同様に計算式を用いて代入するなどができます。
char型の変数は、' 'で文字を指定しますが、代入された変数には、文字コードと呼ばれる数値データになって格納されています。
このため、char型の変数でも、数値を代入することもできます。
char型の変数に' ' で文字を代入し、その変数を数値で表示するサンプルプログラムを次に示します。
#include <stdio.h>
int main(void)
{
char cA = 'A';
char cB = 'B';
printf("%c = %d\n", cA, cA);
printf("%c = %d\n", cB, cB);
return 0;
}
実行結果は、次のようになります。
実行結果
A = 65
B = 66
printf関数では、同じ変数の値を %c と %d で、それぞれ表示しています。%cは、文字表示し、%dは、整数表示をしています。
これで、'A'は、65で、'B'は、66ということが分かったかと思います。
今度は、先ほどのサンプルプログラムの5行目と6行目を、次のように初期値を文字から数値にした場合はどうなるでしょうか?
char cA = 65;
char cB = 66;
想像がついたかもしれませんが、実行結果は、同じになります。
このように、char型は、1文字を扱いますが、文字でなくても数値として扱うことも可能ということが分かったかと思います。
次に、文字に数値を加算したサンプルプログラムを示します。
#include <stdio.h>
int main(void)
{
char moji = 'A';
moji = moji + 1;
printf("%c\n", moji);
printf("%c\n", 'B' + 1);
return 0;
}
実行結果は、次のようになります。
実行結果
B
C
変数のmojiには、初期値として、'A'が代入されています。この'A'に1を加算した値を %c で表示すると、'B'が表示されました。
これは、65 + 1 で、66となり、66は、文字コードとして'B'と同じであるため、このようになりました。
それから、'B' + 1 を表示していますが、このように、1文字に対しても、四則演算することができます。
これは、66 + 1 と同義です。67という文字コードは、'C'に該当するため、%c で表示すると、'C'が表示されます。
このように文字も数値として扱われることが分かりました。
文字を扱う変数については、以上になります。
つづいて、文字列を扱う場合を学びます。