char型配列による文字列

char 型の配列の1つの要素に1文字を格納することで文字列を表現することができます。 たとえば、8 文字までの文字列を格納することができる name という名前の配列は以下のように宣言します。

char name[9];

配列の最初の要素から連続した文字がその配列が表す文字列となります。配列のサイズを超える文字列を格納することはできません。文字列の終端を示すために、文字列の末尾に終端文字が設定されます。終端文字は '\0'(ヌル文字)で、そのアスキーコードは 0 です。従って、配列のサイズは、格納したい文字列の長さ + 1 以上必要なことに気をつけてください。文字列 name には、終端文字 '\0' を含めた最大 9 文字を格納することができます。

文字列の初期化

配列による文字列は、宣言時にリテラルを代入することで以下のように初期化することができます。

char name[9] = "Rose";

初期化する場合は、配列のサイズを省略して以下のように書くこともできます。

char name[] = "Rose";

また、配列であることから以下のように初期化することもできます。

char name[8] = {'R', 'o', 's', 'e'};

いずれの方法も、終端文字 '\0' は自動的に設定されます。char 型配列の文字列では、リテラルの代入は文字列変数の宣言時にしか行うことができません。

文字列の入出力

scanf 関数を用いて、入力された文字列を char 型配列に読み込むことができます。入力変換指定子には'%s' を指定します。

char name[100];
scanf("%s", name);

配列変数がメモリのアドレスを渡しているため、scanf 関数の引数に '&' を指定する必要はありません。scanf 関数で '%s' を指定すると、文字列を空白・改行区切りで配列に読み込みます。初期化と同様に終端文字 '\0' は自動的に設定されます。

printf 関数を用いて、char 型配列で構成された文字列を出力することができます。出力変換指定子には'%s' を指定します。

printf("%s\n", name);

配列のサイズが大きい場合でも、文字列の終端文字 '\0' が識別されて文字列の長さ分だけ出力されます。

文字列の基本操作

char 型配列による文字列の各要素にアクセスするためには、通常の配列と同様に [ ] の中に添字を指定します。

char city[20] = "Aizu-Wakamatsu";

printf("%c\n", city[2]); /* z が出力される */

文字列 city の各文字を大文字に変換して出力するには以下のように書きます。

char city[20] = "Aizu-Wakamatsu";
int i;
for ( i = 0; city[i] != '\0'; i++ ){ /* 終端文字まで繰り返す */
  printf("%c", toupper(city[i])); 
}
printf("\n");
/* Aizu-WAKAMATSU が出力される */

string.hをインクルードすれば、strlen関数で文字列の長さを取得することができます。たとえば、上のプログラムは以下のようにも書けます。

char city[20] = "Aizu-Wakamatsu";
int i;
for ( i = 0; i < strlen(city); i++ ){ /* 文字列の長さだけ繰り返す */
  printf("%c", toupper(city[i]));
}
printf("\n");
/* Aizu-WAKAMATSU が出力される */

strlen 関数に渡されている文字列は値ではなく ポインタ である点に注意してください。 上のプログラムでは、変数名であるcity を strlen 関数の引数として渡しています。ここでは、文字列 "Aizu-Wakamatsu" の長さとして14 が得られ、14文字分繰り返されます。 文字列の長さには、文字列の終端を表すヌル文字が含まれていない点に注意しましょう。

文字列の各文字の変更は、以下のように代入演算で行うことができます。

char city[20] = "Aizu-Wakamatsu";

city[2] = 'd';
city[4] = '\0'; /* この文字列の末尾を5文字目に設定 */
printf("%s\n", city); /* Aidu が出力される */

文字から数値への変換

アスキーコードにおいて、数字は連続したコードが割り当てられているので、文字である数字を整数に変換したい場合は '0' という文字を対象となる文字から引きます。以下にいくつか、例をあげます:

int a = '0' - '0'; /* a は 0 */
int b = '1' - '0'; /* b は 1 */
int c = '2' - '0'; /* c は 2 */

たとえば、文字列 number の文字 i を整数に変換する場合は以下のように記述します:

int num;
num = number[i] - '0';

Reference

 

オンラインジャッジではじめるC/C++プログラミング入門 (マイナビ)

AIZU ONLINE JUDGE のコース問題を題材にした解説書です。各トピックごとに C/C++ 言語の基礎的な内容を学習し、Introduction to Programming の演習問題にチャレンジしていきます。内容は敷居の高いものではなく、プログラミング初学者が取り組む例題からスタートしています。