C言語の配列と文字列の基本を完全ガイド!初心者でもわかる宣言と使い方
生徒
「C言語でたくさんの数字や文字をまとめて扱う方法はありますか?」
先生
「ありますよ。数字をまとめるのが配列、文字をまとめて文章にするのが文字列です。どちらもC言語の基本で、実用プログラムの土台になります。」
生徒
「配列と文字列の違いがまだピンときません。初心者にも分かる例で教えてください!」
先生
「配列は“同じ大きさの引き出しが並ぶタンス”、文字列は“文字を並べて最後に印を付ける箱”と考えると分かりやすいです。順番に見ていきましょう。」
1. 配列とは?同じ型のデータを並べて保存する箱
配列とは、同じ型の値を連続してならべて保存する仕組みです。C言語の配列は、整数なら整数だけ、実数なら実数だけというように、ひとつの型でそろえるのがルールです。イメージとしては、番号がふられた引き出しが横に並んだタンスで、先頭の引き出しを基準にして、0番目、1番目、2番目と順番にアクセスします。この番号を添字と呼びます。添字は必ず0から始まる点が大切です。1からではないことに注意しましょう。
配列を使うと、テストの点数、曜日の一覧、温度の記録など、まとまったデータを一括で処理できます。C言語の初学者は、まず「0から数える」「同じ型でそろえる」という二つの基本を身につけると、エラーが大幅に減ります。
2. 配列の宣言と初期化の基本
配列を使うには、個数を指定して宣言します。整数を5個保存するなら、整数型の箱を5つ並べると宣言します。さらに最初の値をまとめて与える初期化もできます。初期化をしておくと、予想外の値が入ってトラブルになるのを防げます。配列の個数はプログラムが使える数の上限であり、途中で自動的には増えません。必要な個数を見積もって宣言しましょう。
int scores[5]; // 5個の整数を入れる配列
int small[3] = {10, 20, 30}; // 初期化つき
上の例では、3つの整数が順番に格納されます。未指定の要素は不定値になるため、必ず必要なら初期化しておきます。配列名は箱の列全体を示す名前で、要素にアクセスするときは添字を使います。
3. for文で配列をなめらかに処理する
配列の強みは、くり返し処理と相性が良い点です。for文と組み合わせれば、先頭から最後まで順番に計算や表示を行えます。配列の個数を使ってループを回すことで、メンテナンス性の高いコードになります。初心者は、固定の数値を直接書くより、配列のサイズを使う習慣を身につけると安全です。
int i;
int scores[5] = {72, 65, 90, 88, 76};
for(i = 0; i < 5; i++)
{
printf("%d\n", scores[i]);
}
この例では、0から4までの要素を順番に表示します。配列の範囲外にアクセスすると、メモリの別領域へ触れてしまい、予測不能な動作になります。必ず「0以上、個数未満」の範囲を守りましょう。
4. 配列のサイズを計算して安全にアクセスする
要素数をコードに書き込むと、あとで配列の大きさを変えたときに修正漏れが起きやすくなります。C言語では、配列の全体サイズを要素1個のサイズで割ることで、現在の要素数を計算できます。これにより、安全で読みやすいループを実現できます。
int arr[6] = {1,2,3,4,5,6};
int n = (int)(sizeof(arr) / sizeof(arr[0]));
for(int i = 0; i < n; i++)
{
printf("%d\n", arr[i]);
}
この書き方は、配列の長さが変わってもループ条件を自動で調整してくれます。C言語の実務でも広く使われる定番パターンです。
5. 文字列とは?char配列に文字を並べたデータ
文字列は、char型の配列に文字を連続で並べ、最後に終端記号を置いたものです。この終端記号は'\0'(ヌル文字)と呼ばれ、「ここで文字列が終わります」という印の役割を持ちます。英字でも日本語でも、C言語の文字列は「最後に終端記号がある配列」という考えが基本です。終端がないと、表示や計算が止まらずに暴走します。
char msg1[6] = {'H','e','l','l','o','\0'};
char msg2[] = "Hello"; // 終端は自動で付く
配列のサイズは、文字の数に終端記号の1文字を足した大きさが必要です。たとえば「Hello」は5文字なので、6文字分の箱を用意します。文字列リテラルで初期化すると、コンパイラが自動で終端を付けてくれます。
6. 文字列を表示して長さを扱う基本
C言語で文字列を表示するには、%sを使います。文字列の長さを調べたいときは、標準ライブラリの関数を使うと便利です。文字列の扱いは配列の扱いでもあるので、終端記号の存在を常に意識します。
#include <stdio.h>
#include <string.h>
int main(void)
{
char name[] = "C-language";
printf("%s\n", name);
printf("len=%zu\n", strlen(name));
return 0;
}
C-language
len=11
strlenは終端記号まで数えるため、実際の箱の大きさ(配列長)とは一致しないことに注意しましょう。必要な長さより短い配列を用意すると、代入時に終端が欠ける危険が出ます。
7. 入力の基本:安全に読み込むには終端を守る
ユーザーから文字列を入力するときは、長さ制限を付けて読み込むのが安全です。C言語では、終端記号がきちんと収まるように、配列のサイズと読み込む最大文字数を調整します。サイズより多い文字を無理に入れようとすると、終端が消えて不具合になります。
#include <stdio.h>
int main(void)
{
char buf[16];
fgets(buf, sizeof(buf), stdin); // 安全に読み込む例
printf("%s", buf);
return 0;
}
長さを指定できる関数を使うと、配列の領域を超えないように自動で調整してくれます。配列と文字列の安全は、終端を守ることから始まります。
8. 文字列のコピーと連結の考え方
文字列をコピーしたり、後ろにくっつけたりする処理はよく使います。コピーや連結では、行き先の配列に十分な大きさが必要です。終端記号を含めた合計の長さを見積もってから操作するのがコツです。長さを超えて書き込むと、別のデータを壊してしまいます。
#include <stdio.h>
#include <string.h>
int main(void)
{
char a[16] = "C";
char b[] = "-lang";
strcat(a, b); // aの末尾にbを連結(aは十分に大きい前提)
printf("%s\n", a);
return 0;
}
C-lang
配列の長さに余裕がないときは、長さを指定して操作する関数を選ぶ、または十分な配列サイズを確保してから処理しましょう。
9. 2次元配列と文字列リストの基本
複数の文字列を同じ長さの箱でそろえて保存したいときは、2次元配列を使えます。縦が行、横が列に相当し、「人数 × 最大文字数」のように表現できます。長さが固定でよい場面では管理が分かりやすくなります。
#include <stdio.h>
int main(void)
{
char days[7][10] = {
"Sun","Mon","Tue","Wed","Thu","Fri","Sat"
};
for(int i = 0; i < 7; i++)
{
printf("%s\n", days[i]);
}
return 0;
}
各行は同じ最大長で確保され、短い単語でも終端記号まで含めて安全に格納されます。一覧表示や簡単な辞書などに便利です。
10. 配列と文字列でよくあるつまずきポイント
初心者がよくつまずくのは、添字の始まりが0であること、配列の範囲外アクセス、文字列の終端記号の欠落です。C言語は箱の外に出てもすぐには教えてくれないため、範囲や長さを自分で守る必要があります。「0から数える」「個数未満まで」「終端記号を含める」の三点を意識すると、多くのトラブルを避けられます。配列は数のまとまり、文字列は文字のまとまりという感覚を持ち、サイズを常に意識して安全に扱いましょう。