C初級:文字と文字配列

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

前回の数値配列に引き続き文字型を使った配列について扱います。
C言語では、半角1文字を格納できる変数型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言語でのchar型は半角1文字を扱うデータ型です。
半角1文字(バイト文字とも呼びます)は、(シングルクォーテーション)でくくります。

宣言

char c;

代入

c = ‘A’;

宣言と同時に代入も可能

char c = ‘A’;

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

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[5];	/* 文字配列半角5文字分 */
	
	printf("1文字入力してください: ");
	scanf("%c", &c);
	
	printf("文字列を入力してください: ");
	scanf("%s", s);
	
	printf("[%c]\n", c);
	printf("[%s]\n", s);

	return 0;
}

実行結果

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

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

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

scanf(“%s”, s);

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

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

コメント