C初級:文字の取り扱いと文字配列

C言語初級カテゴリのロゴ画像C言語初級
スポンサーリンク

C言語では、バイト文字(半角1文字)を格納できる変数型 char を使って文字文字列を表現します。
ここで言う文字とはバイト文字(半角1文字分)を表し、文字列とは、バイト文字の集まりを表します。(ちなみにC言語で文字はchar型変数で表しますが、文字列はchar型配列を使います)

以下利用例を交え、文字の取り扱いと文字配列について解説します。

参考

C初級:配列の利用例とメリット
変数を拡張した考え方として配列があります。 配列も変数です。通常の変数と違うのは添え字(そえじ)呼ばれる番号がついている点です。 以下は、5つの数値を配列に代入してその合計値を表示するサンプルです。
スポンサーリンク

C言語の文字列の考え方

Java、C#、Python、JavaScriptなどでは、文字列を扱うデータ型が用意されているので、Javaなど他の言語を知っているいる人からするとC言語は特殊にうつるかもしれません。
例えばJavaでは、文字列Hello, world!を変数に代入する場合、

String str = "Hello, world!";

のようにします。

C言語だとchar型の配列で文字列を表すので

char str[] = "Hello, world!";

となります。

実際は、JavaのStringはデータ型ではなくクラスです。便宜上データ型のように扱うことが多いです。
他の言語の仕様も似たりよったりです。ですからC言語での「文字列をchar型の配列として扱う」という考え方は、C言語以外のプログラミング言語ではピンとこないかもしれません。

文字を変数に代入する方法

C言語でのchar型はバイト文字(半角1文字)を扱うデータ型です。
バイト文字は、(シングルクォーテーション)でくくります。

宣言

char c;

代入

c = 'A';

宣言と同時に代入も可能

char c = 'A';

上記シングルクォーテーションでのバイト文字代入方法は、あくまで人間が見て分かりやすい方法です。
バイト文字は全てASCIIコード番号に置き換えられてしまいますので、実際には

char c = 65;

としても文字 A を代入したことになります。

文字列を変数に代入する方法

char型の配列を用います。
またchar型変数にバイト文字を代入する場合と違い、char型配列に文字列を代入するには、 (ダブルクォーテーション)を使います。

宣言と同時に代入

char str[6] = "Hello";

上記配列の要素数は宣言と同時に代入した場合に限り、要素数の省略ができます。

char str[] = "Hello";

ここで注意したいのが、文字列を代入した際に自動的に文字列の最後に\0(ヌル文字)が挿入されるということです。

以下は、イメージです。
文字列にヌル文字が自動的に挿入される画像
よって必要な文字数+1文字が配列の要素数として最低限必要になります。
例えば「Hello」だと必要な配列要素数は6となります。
scanfで文字列を配列に読み込む場合も同様です。

また、変数宣言と同時に文字列代入は可能ですが、宣言後に文字列を代入することはできません

これはエラーです

char message[16];
message = “I have a dream!”;

これもエラーです

char message[] = “I have a dream!”;
message = “I have a pen!!!”;

文字と文字列を使ったサンプルプログラム

24char.c

/* 24char.c 文字型 */
#include <stdio.h>

int main(void)
{
	char c = 'X';				/* 1文字 */
	char message[] = "I have a dream!";	/* 文字列 */

	printf("%c\n", c);
	printf("%s\n", message);
	printf("%c\n", message[4]);

	return 0;
}

実行結果

X
I have a dream!
v

解説

C言語でバイト文字(半角1文字)を代入する場合は、‘(シングルクォーテーション)でくくります。

char c = ‘X’; /* 1文字 */

文字列は、文字型(char型)の配列と考えるため以下のように“(ダブルクォーテーション)でくくって配列として扱います。

char message[] = “I have a dream!”; /* 文字列 */

バイト文字(半角1文字)の出力は、printf関数の書式指定子 %c を使います。

printf(“%c\n”, c);

文字列の出力は、printf関数の書式指定子 %s を使います。

printf(“%s\n”, message);

配列messageは、配列の添え字を指定して1文字だけ取り出すこともできます。

printf(“%c\n”, message[4]);

上記の場合、配列5番目の文字を表示しています。

I have a dream!

配列messageの要素数は、16文字となります。
I have a dream!の最後に文字列の終わりを表すヌル文字 \0 が自動で挿入されるためです。

C言語の文字列の最後には\0(ヌル文字)が自動的に付加される

キーボードから文字と文字列を入力するサンプルプログラム

25char.c

/* 25char.c 文字の入力 */
#include <stdio.h>

int main(void)
{
	char c;		/* バイト文字1文字分 */
	char s[64];	/* バイト文字64文字分(ただし有効文字は63文字) */

	printf("1文字入力してください: ");
	scanf("%c", &c);

	printf("文字列を入力してください: ");
	scanf("%s", s);

	printf("[%c]\n", c);
	printf("[%s]\n", s);

	return 0;
}

実行イメージ

1文字入力してください: A [Enter]
文字列を入力してください: Hello! [Enter]
[A]
[Hello!]

解説

基本は前述の文字と文字列のサンプルと同様です。

配列にキーボードから入力する処理

scanf(“%s”, s);

では、入力した文字の最後に自動的に文字列の終わりを表す\0(ヌル文字)が代入されます。
ですから確保する配列要素数は入力したい文字の最大数+1となることを考慮してください。

scanf関数は使ってはいけない関数の1つ(宣言した要素数以上を入力するとプログラムが停止してしまうため)ですが、この回では、便宜上scanfを使わせて頂きます。

コメント