🖥️

【C言語超入門】 第10回 配列と文字列

2024/12/25に公開

https://youtu.be/x6bIXqLDTO8

四国めたん
\textcolor{pink}{四国めたん: }教師役ですわ

ずんだもん
\textcolor{lime}{ずんだもん: }生徒役なのだ

\footnotesize \textcolor{pink}{四国めたん:} 皆さん、こんにちは。四国めたんです

\footnotesize \textcolor{lime}{ずんだもん:} ずんだもんなのだ。こんにちはなのだ

\footnotesize \textcolor{pink}{四国めたん:} 今回もC言語のお勉強をしていきましょう

\footnotesize \textcolor{lime}{ずんだもん:} レッツゴーなのだ

\footnotesize \textcolor{pink}{四国めたん:} 第10回目の今回は 配列と文字列 についてお話ししますわ

\footnotesize \textcolor{lime}{ずんだもん:} 前回が 条件分岐 だったので 反復 についてのお話しだと思っていたのだ

\footnotesize \textcolor{pink}{四国めたん:} 反復 についてお話ししたかったのですが、 配列 を理解していることが前提なのですわ

\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ。だから今回は 配列と文字列 なのか

\footnotesize \textcolor{lime}{ずんだもん:} でも 配列 だけではなく 文字列 もなのか?

\footnotesize \textcolor{pink}{四国めたん:} はい、それについては後ほど説明いたしますわ

配列は変数の集合ですか?

\footnotesize \textcolor{pink}{四国めたん:} それではまず 配列 についてお話ししますわね

\footnotesize \textcolor{lime}{ずんだもん:} よろしくなのだ

\footnotesize \textcolor{pink}{四国めたん:} 例えばですが、100個のリンゴの重さを変数に入力して、平均を計算するとしますわね

\footnotesize \textcolor{lime}{ずんだもん:} 100個も変数を用意するのか?

\footnotesize \textcolor{lime}{ずんだもん:} 変数名を考えるだけでも大変なのだ

\footnotesize \textcolor{pink}{四国めたん:} 100個程度であれば何とかなるでしょうが、1万個、10万個となるとどうしようもありませんわね

\footnotesize \textcolor{pink}{四国めたん:} そこで登場するのが 配列 ですわ

\footnotesize \textcolor{lime}{ずんだもん:} 配列 とは、ズバリどんなものなのだ?

\footnotesize \textcolor{pink}{四国めたん:} 配列 とは、同じ性質を持つ複数の変数を1つの変数名で扱う仕組みですわね

\footnotesize \textcolor{lime}{ずんだもん:} それぞれの変数の区別はどうするのだ?

\footnotesize \textcolor{pink}{四国めたん:} インデックス を使いますわ

\footnotesize \textcolor{lime}{ずんだもん:} インデックス

\footnotesize \textcolor{pink}{四国めたん:} はい、変数名に角括弧"[]"をつけて、その中に インデックス つまり 添え字 を指定します

まずは配列の例を見てみるのだ

\footnotesize \textcolor{pink}{四国めたん:} 何はともあれ例を見てみましょう

#include <stdio.h>

void main() {
  int apple[3] = {300, 250, 310};
  int average = (apple[0] + apple[1] + apple[2]) / 3;

  printf("リンゴの重さの平均は%dグラムです\n", average);
}

\footnotesize \textcolor{pink}{四国めたん:} 3個のリンゴの重さの平均値を出すプログラムですわ

\footnotesize \textcolor{lime}{ずんだもん:} 100個のリンゴではないのか?

\footnotesize \textcolor{pink}{四国めたん:} さすがに100個分のリンゴの重さを準備するのは大変なので3個で勘弁してくださいな

\footnotesize \textcolor{lime}{ずんだもん:} かんべんするのだ

プログラムの説明です

\footnotesize \textcolor{pink}{四国めたん:} 先ずは変数の宣言についてですわ

\footnotesize \textcolor{lime}{ずんだもん:} なんか角括弧"[]"がついて、波括弧"{}"で括られた値が3つ、代入されているのだ

\footnotesize \textcolor{pink}{四国めたん:} はい、整数型の変数"apple"に続けて保持する重さの数を角括弧"[]"を付けて指定していますわ

\footnotesize \textcolor{lime}{ずんだもん:} リンゴが3つなので"3"としているのだ

\footnotesize \textcolor{pink}{四国めたん:} 次に初期化ですが、"="に続き波括弧"{}"内にカンマで区切って列挙しますわ

\footnotesize \textcolor{lime}{ずんだもん:} ちょうど3つの値で初期化されているのだ

\footnotesize \textcolor{pink}{四国めたん:} 平均値"average"を求めるには"apple"の個々の値を足し合わせて、3で割れば出ますわね

\footnotesize \textcolor{lime}{ずんだもん:} 平均値を求めるための普通の方法なのだ

\footnotesize \textcolor{pink}{四国めたん:} なお"apple"の個々の値は 要素 と呼ばれますわ

\footnotesize \textcolor{pink}{四国めたん:} その指定は変数名"apple"に角括弧"[]"を付けたインデックスを付加することで行いますわ

\footnotesize \textcolor{lime}{ずんだもん:} "apple"の宣言の時に指定した、配列のサイズと同じように見えるのだ

\footnotesize \textcolor{pink}{四国めたん:} 同じように見えても、意味が全く異なりますので注意して下さいね

\footnotesize \textcolor{pink}{四国めたん:} 宣言時は 配列のサイズ 、個々の値の指定時には インデックス を指定しますわ

\footnotesize \textcolor{lime}{ずんだもん:} わかったのだ

\footnotesize \textcolor{pink}{四国めたん:} とりあえず実行してみましょう

リンゴの重さの平均値

\footnotesize \textcolor{lime}{ずんだもん:} コンソールに「リンゴの重さの平均は286グラムです」と表示されたのだ

配列のインデックスの範囲は?

\footnotesize \textcolor{pink}{四国めたん:} ところでC言語においては、配列のインデックスは"0"から始まりますわ

\footnotesize \textcolor{lime}{ずんだもん:} これは決まり事なので、しかたがないのだ

\footnotesize \textcolor{pink}{四国めたん:} またインデックスの最後は、配列のサイズを"n"とすると"n-1"ですわ

\footnotesize \textcolor{lime}{ずんだもん:} つまり、インデックスで指定できるのは0~(n-1)の範囲なのだ

\footnotesize \textcolor{pink}{四国めたん:} はい、プログラム例では0~2の範囲がインデックスとして指定できますわね

\footnotesize \textcolor{lime}{ずんだもん:} ところで範囲外の値をインデックスとして指定はできないのか?

\footnotesize \textcolor{pink}{四国めたん:} 実は指定出来てしまいます

\footnotesize \textcolor{lime}{ずんだもん:} え~、そうなのか?

\footnotesize \textcolor{pink}{四国めたん:} 場合によってはエラーもワーニングも表示されませんので、気をつけてくださいね

\footnotesize \textcolor{pink}{四国めたん:} 試しにプログラム例で"apple[2]"となっている部分を"apple[3]"としてみましょう

#include <stdio.h>

void main() {
  int apple[3] = {300, 250, 310};
  int average = (apple[0] + apple[1] + apple[3]) / 3;

  printf("リンゴの重さの平均は%dグラムです\n", average);
}

範囲外のインデックス

\footnotesize \textcolor{lime}{ずんだもん:} コンソールに「リンゴの重さの平均は-286330970グラムです」と表示されているのだ

\footnotesize \textcolor{pink}{四国めたん:} はい、値は異なっているかもしれませんが、おかしな値が表示されていますわね

\footnotesize \textcolor{lime}{ずんだもん:} 「C6385 'apple' から無効なデータを読み取っています。」という警告が出ているのだ

範囲外の警告

\footnotesize \textcolor{pink}{四国めたん:} Visual Studioでは警告を出してくれていますわね

\footnotesize \textcolor{pink}{四国めたん:} でも常に警告を出してくれる訳ではないので、インデックスの範囲は細心の注意を払う必要がありますわ

\footnotesize \textcolor{lime}{ずんだもん:} 気を付けるのだ

配列の初期化方法にはバリエーションがありますわよ

\footnotesize \textcolor{pink}{四国めたん:} ところで配列の初期化ですが、バリエーションがありますわ

\footnotesize \textcolor{lime}{ずんだもん:} 波括弧"{}"の中に列挙するだけではないのか?

\footnotesize \textcolor{pink}{四国めたん:} はい、波括弧"{}"の中に列挙する方法で幾つかのバリエーションがありますわ

初期化する要素の数は合わせましょう

\footnotesize \textcolor{pink}{四国めたん:} まずは波括弧"{}"の中に列挙する初期化についてお話ししますわ

\footnotesize \textcolor{lime}{ずんだもん:} 基本的な初期化の方法は前に教えてもらったのだ

\footnotesize \textcolor{pink}{四国めたん:} 復習しますが、"="に続き波括弧"{}"内に各要素の初期値をカンマ区切りで列挙しますわ

\footnotesize \textcolor{lime}{ずんだもん:} 配列の要素数と波括弧"{}"内の初期値の数は異なっていてはいけないのか?

\footnotesize \textcolor{pink}{四国めたん:} 基本的には同じにした方が良いですわね

\footnotesize \textcolor{lime}{ずんだもん:} ちなみに波括弧"{}"内の初期値の数が、配列の要素数よりも多い場合はどうなるのだ?

\footnotesize \textcolor{pink}{四国めたん:} 単純にエラーとなりますわ

\footnotesize \textcolor{pink}{四国めたん:} 確認してみましょう

#include <stdio.h>

void main() {
  int apple[3] = {300, 250, 310, 400};
  int average = (apple[0] + apple[1] + apple[2]) / 3;

  printf("リンゴの重さの平均は%dグラムです\n", average);
}

初期化子のエラー

\footnotesize \textcolor{lime}{ずんだもん:} 「初期化子の値が多すぎます」というエラーが出ているのだ

\footnotesize \textcolor{lime}{ずんだもん:} では波括弧"{}"内の初期値の数が、配列の要素数よりも少ない場合はどうなるのだ?

\footnotesize \textcolor{pink}{四国めたん:} 初期値が指定されなかった要素が 0 に初期化されますわ

\footnotesize \textcolor{lime}{ずんだもん:} エラーにはならないのか

\footnotesize \textcolor{pink}{四国めたん:} なりませんわね

\footnotesize \textcolor{pink}{四国めたん:} とりあえず2つの要素のみを指定して実行してみましょう

#include <stdio.h>

void main() {
  int apple[3] = {300, 250};
  int average = (apple[0] + apple[1] + apple[2]) / 3;

  printf("リンゴの重さの平均は%dグラムです\n", average);
}

初期化子が少ない場合の出力

\footnotesize \textcolor{lime}{ずんだもん:} 「リンゴの重さの平均は183グラムです」と表示されたのだ

\footnotesize \textcolor{pink}{四国めたん:} はい、"apple[2]"が0に初期化され、"(300 + 250 + 0) / 3"が平均として計算された結果ですわね

初期化する際の要素数は省略できます

\footnotesize \textcolor{pink}{四国めたん:} なお波括弧"{}"の中に列挙する初期化では、要素数の指定を省略できますわ

\footnotesize \textcolor{lime}{ずんだもん:} 省略したら要素数はどのように決まるのだ?

\footnotesize \textcolor{pink}{四国めたん:} 波括弧"{}"内の初期値の数が、要素数になりますわ

\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ

\footnotesize \textcolor{pink}{四国めたん:} とりあえず要素数を省略して実行してみましょう

#include <stdio.h>

void main() {
  int apple[] = {300, 250, 310};
  int average = (apple[0] + apple[1] + apple[2]) / 3;

  printf("リンゴの重さの平均は%dグラムです\n", average);
}

\footnotesize \textcolor{pink}{四国めたん:} printf()の行にブレークポイントを設定してappleの要素数を確認してみますわ

要素数の確認

\footnotesize \textcolor{lime}{ずんだもん:} 要素数が3になっているのだ

要素の0クリアによる初期化は簡単です

\footnotesize \textcolor{pink}{四国めたん:} 値を指定して初期化する以外にも、全てを0で初期化することもできますわ

\footnotesize \textcolor{lime}{ずんだもん:} 全ての要素に0を指定して初期化すればいいのではないのか?

\footnotesize \textcolor{pink}{四国めたん:} 確かにそれでもOKですが、もっと簡単な方法がありますわ

\footnotesize \textcolor{lime}{ずんだもん:} 簡単な方法があれば、そのほうがいいのだ

\footnotesize \textcolor{pink}{四国めたん:} 先ほど、初期値の数が、要素数より少ない場合に、余った要素が0に初期化されるとお話ししましたわね

\footnotesize \textcolor{lime}{ずんだもん:} おぼえているのだ!

\footnotesize \textcolor{pink}{四国めたん:} その応用として最初の要素だけを0と指定することで全ての要素を0に初期化することができますわ

\footnotesize \textcolor{lime}{ずんだもん:} そんな方法があったのか!

\footnotesize \textcolor{pink}{四国めたん:} とりあえず確認してみましょう

#include <stdio.h>

void main() {
  int apple[3] = {0};
  int average = (apple[0] + apple[1] + apple[2]) / 3;

  printf("リンゴの重さの平均は%dグラムです\n", average);
}

\footnotesize \textcolor{pink}{四国めたん:} printfの行にブレークポイントを設定して実行してみましょう

appleの値確認

\footnotesize \textcolor{lime}{ずんだもん:} appleの各要素が0になっているのだ

\footnotesize \textcolor{pink}{四国めたん:} ちなみにint apple[3] = {};と要素の初期値を1つも指定しない場合にはエラーとなりますわ

#include <stdio.h>

void main() {
  int apple[3] = {};
  int average = (apple[0] + apple[1] + apple[2]) / 3;

  printf("リンゴの重さの平均は%dグラムです\n", average);
}

0への初期化エラー

\footnotesize \textcolor{lime}{ずんだもん:} たしかにエラーになっているのだ

文字列はchar型の配列ですよ

\footnotesize \textcolor{pink}{四国めたん:} 次に 文字列 についてお話ししましょう

\footnotesize \textcolor{lime}{ずんだもん:} まっていたのだ

\footnotesize \textcolor{pink}{四国めたん:} 簡単にいえば 文字列char型の配列 のことをさしますわ

\footnotesize \textcolor{lime}{ずんだもん:} 配列 なのか?

\footnotesize \textcolor{pink}{四国めたん:} その通りですわ

\footnotesize \textcolor{pink}{四国めたん:} まずは試してみましょう

#include <stdio.h>

void main() {
  char string[] = "apple";

  printf("文字列は「%s」です\n", string);
}

\footnotesize \textcolor{pink}{四国めたん:} char型 の配列を文字列として使用する場合には、波括弧"{}"の代わりに文字列を初期化に使用できますわ

\footnotesize \textcolor{lime}{ずんだもん:} 配列のサイズは指定しないのか?

\footnotesize \textcolor{pink}{四国めたん:} 文字列で初期化する場合には配列のサイズ指定は行わなくても問題ありませんわね

\footnotesize \textcolor{lime}{ずんだもん:} つまり自動的に割り当ててくれるのか?

\footnotesize \textcolor{pink}{四国めたん:} はい、その通りですわ

\footnotesize \textcolor{pink}{四国めたん:} でも、後で文字列を変更する予定がある場合には、文字数とかを考えてサイズを指定しなければいけませんわ

\footnotesize \textcolor{lime}{ずんだもん:} わかったのだ

\footnotesize \textcolor{pink}{四国めたん:} とりあえずprintf文の行にブレークポイントをセットして実行してみましょう

文字列stringの確認

\footnotesize \textcolor{lime}{ずんだもん:} "string"の種類がchar[6]となっているのだ

\footnotesize \textcolor{pink}{四国めたん:} はい、サイズが6の char型の配列 ですわね

\footnotesize \textcolor{lime}{ずんだもん:} でも"apple"は5文字なのに、なぜサイズが6なのだ?

\footnotesize \textcolor{pink}{四国めたん:} 実はC言語では、文字列には必ず最後に'0'を追加するという決まりがあります

\footnotesize \textcolor{lime}{ずんだもん:} つまり"apple"の後に'0'が追加されているということか?

\footnotesize \textcolor{pink}{四国めたん:} その通りですわ

\footnotesize \textcolor{pink}{四国めたん:} ですので"apple"の5文字に'0'を入れる場所を追加して、"string"のサイズは6となりますわ

\footnotesize \textcolor{pink}{四国めたん:} ところで"string"の左の三角"▷"をクリックしてみましょう

文字列stringの要素

\footnotesize \textcolor{lime}{ずんだもん:} おや?下になんか、文字がでてきたのだ

\footnotesize \textcolor{pink}{四国めたん:} はい、これで"string"の各要素の値を確認できますわ

\footnotesize \textcolor{lime}{ずんだもん:} お~、最後の要素の"[5]"には、しっかりと"0'\small\backslash 0'"が入っているのだ

\footnotesize \textcolor{lime}{ずんだもん:} ところで'\small\backslash 0'とは何なのだ?

\footnotesize \textcolor{pink}{四国めたん:} アスキーコード表の'0'、つまり"NUL"のことですわ

\footnotesize \textcolor{lime}{ずんだもん:} いろいろな書き方があって迷ってしまうのだ

\footnotesize \textcolor{pink}{四国めたん:} とりあえず慣れるしかありませんわね

\footnotesize \textcolor{lime}{ずんだもん:} あと、printfの中で%sというのがでてくるが、なんなのだ?

\footnotesize \textcolor{pink}{四国めたん:} 文字列を表示するときに使用する 書式指定子 ですわ

\footnotesize \textcolor{lime}{ずんだもん:} なるほど、おぼえておくのだ

\footnotesize \textcolor{pink}{四国めたん:} ちなみに指定する変数名には角括弧"[]"を付けませんので、注意して下さいね

\footnotesize \textcolor{lime}{ずんだもん:} わかったのだ

キーボードから文字列を入力しよう

\footnotesize \textcolor{pink}{四国めたん:} 最後にキーボードからの入力を受け付けて表示するプログラムを試してみましょう

#include <conio.h>
#include <stdio.h>

void main() {
  char string[4] = "";

  printf("3文字を入力してください\n");

  string[0] = _getch();
  string[1] = _getch();
  string[2] = _getch();

  printf("文字列は「%s」です\n", string);
}

\footnotesize \textcolor{pink}{四国めたん:} とりあえずprintfの各行にブレークポイントをセットして実行してみましょう

最初のブレークポイント

\footnotesize \textcolor{lime}{ずんだもん:} 最初のprintfのブレークポイントで止まったのだ

\footnotesize \textcolor{pink}{四国めたん:} ここではstringの最初の要素が0にクリアされていることを確認してくださいね

\footnotesize \textcolor{pink}{四国めたん:} なお"string"の初期化= ""を忘れないで下さいね

\footnotesize \textcolor{lime}{ずんだもん:} "string"のサイズは4なのか?

\footnotesize \textcolor{pink}{四国めたん:} はい、キーボードからの入力を3文字に想定していますので、サイズは4ですわね

\footnotesize \textcolor{lime}{ずんだもん:} 最後の要素として0が必要なので、サイズ4の配列として宣言しているのか

\footnotesize \textcolor{pink}{四国めたん:} では、プログラムを継続し、キーボードから"a", "b", "c"の3文字を入力しますわね

最後のブレークポイント

\footnotesize \textcolor{lime}{ずんだもん:} 次のprintfのブレークポイントで止まったのだ

\footnotesize \textcolor{pink}{四国めたん:} はい、ここで"string"の各要素を確認してみましょう

\footnotesize \textcolor{lime}{ずんだもん:} 入力した文字"abc"と最後の'0'が入っているのだ

まとめ

\footnotesize \textcolor{pink}{四国めたん:} お疲れさまでした

\footnotesize \textcolor{lime}{ずんだもん:} おつかれさまなのだ

\footnotesize \textcolor{pink}{四国めたん:} 以上で 配列と文字列 を終了しますわ

Discussion