【基礎から学ぶプログラミング言語】 C言語/char型と配列変数を組み合わせて文字列を作る方法

IT
スポンサーリンク
スポンサーリンク
スポンサーリンク

私たちは日常生活で何気なくパソコンやスマートフォンというコンピュータを使用しています。
これらのコンピュータが普通に動作しているのは、そのようにプログラミング言語が記述されているからです。
本記事は、そんなプログラミング言語について実際に学びながら要点をまとめていったメモという位置付けになります。
私は専攻が電気でプログラムに関しては全くの初心者ですので、同様に初心者の方には理解しやすくなっているかと思います。

今回は、「C言語/char型と配列変数を組み合わせて文字列を作る方法」についての説明です。

1.初めに

前回、配列変数とはどんなものなのかを説明しました。
その説明においては、数字を配列していましたので、次は文字の配列について解説していきます。
ただ、文字というとchar型が出てくるのですが、本ブログではchar型については一瞬名前と機能説明が出てきただけで、使用事例をまとめていなかったんですよね。

ということで、今回はchar型の根本的な使い方をまとめつつ、char型と配列変数を組み合わせて文字列を作る方法について解説していきます。

2.char型の補足説明

まずはchar型の補足説明から入ります。

char型とは?

charはintやdoubleと同じデータ型です。
intとdoubleは数字の入れ物でしたが、charは文字の入れ物になります。

注意点は、文字列ではなく文字の入れ物だという点です
要するに、1文字しか入れることはできません。

数字を入力する際は「”(ダブルクオーテーション)」で囲んでいましたが、文字の場合は「'(シングルクォーテーション)」で囲む必要があるという点にも注意しましょう。
結構忘れるんですよね。

ちょっとルールが変わるだけで、本ブログで散々使ってきたint型と同じようなものということですね。

3.char型と配列変数の組み合わせ

charは1文字だけ入力できる入れ物を作る関数だとわかりました。
ですが、何らかの方法で文字を連続で並べることができるのなら、それは文字列になりますよね?
ということは、charと配列を組み合わせれば文字列って作れるんですよ

方法はいくつか存在しますので、順番に見ていきましょう。

文字列の作り方①

まずは以下のようなプログラムを書いてみます。

#include<stdio.h>

void main() {
char m1[4] = { ‘a’,’b’,’c’,’\0′ };
printf(“%s”, m1);
}

図1

【char m1[4]】としているので、文字を入力できる変数m1[0]・m1[1]・m1[2]・m1[3]が定義されます。
なので、m1[0]=a・m1[1]=b・m1[2]=cになるのはわかるかと思いますが、m1[3]には【\0】という変なヤツがいますよね?
この【\0】は文字列の終わりを意味する記号です。
要するに、この【\0】がいることで変数m1はm1[0]・m1[1]・m1[2]が繋がった文字列になるのです
この【\0】のことはNULL文字といいます。

文字列の変換指定子は%sなので、5行目では変数m1が何になっているのかを表示しているだけです。

このプログラムを実行すると、【abc】と表示されます。
char型で文字列が作れたでしょう?

なんでこんな回りくどいことをしているのかというと、C言語には文字列のデータ型が存在しないんです。
数字を表すデータ型であるintやdouble、文字を表すデータ型であるchar…これらのように文字列を表すためのデータ型が無いんです。
なので、文字の配列を文字列とみなしているのです。

ちなみに、【\0】のところに【d】と入力してみると以下のようになります。

文字列の終わりを示す記号が無くなってしまっているので、バグってますね。
なので、定義する文字数は、必要になる文字数+1(【\0】の分)を用意する必要があります。
半角の「フ」は初期化されていない場合に表示される文字ですが、残りは何なのか現状はわかっていません。

文字列の作り方②

次は、以下のようにプログラムを記述してみます。

#include<stdio.h>

void main() {
char m2[] = “mojiretsu”;
printf(“%s”, m2);
}

図2

[]の中に添え字を入力しない場合、続いて入力した分だけ配列変数を定義・初期化すると前回説明しました。
なので、【mojiretsu】の9文字文の配列変数が作られるわけです。

このプログラムを実行すると、【mojiretsu】と表示されます。

ただ、「文字列の作り方①」で、文字列の終わりを意味する【\0】の話をしましたよね?
ここの事例では、見ての通り【\0】が存在しません。
この場合、『文字列として成り立たないのでは?』と思うかもしれませんが、自動的に最後に【\0】が挿入されて処理されるという決まりになっていますので、気にしなくてOKです。

実際、デバッグをして処理内容を確かめてみると、一番最後に【\0】に値する処理が行われていることがわかります。
[9]の処理のことです。
何故か【\0】という表記ではなくバックスラッシュに0がくっついていますが、これが【\0】に該当しています。

図3

ちなみに、【”mojiretsu”】のところを中括弧で囲んで【{“mojiretsu”}】と入力しても、同様の結果が得られます。
そもそも文字は「’」で囲むルールだったのに、なんで「”」になっているんでしょうね?

文字列の作り方③

今度は、scanfと組み合わせてキーボード入力した文字列を出力してみます。

#include<stdio.h>

void main() {
char m3[20];
printf(“文字列を20文字以内で入力してください。”);
scanf(“%s”, m3);
printf(“入力した文字列は%sです。”, m3);
}

図4

8行目では、変数m3[0]~m3[19]が定義されていますが、ここで初期化は行いません。

10行目で登場するscanfは、キーボード入力を促す関数でしたね?
その入力ルールは、過去に以下のように説明しました。

scanf(“変換指定子” , &変数名);

さて、違和感を感じましたでしょうか?
変数名の前の「&」が消えていますね。
配列変数を使用する場合、「&」を付けないルールになっています。
ここは注意が必要です。
何故このようになっているのかは、今は置いておきます。
いつかまとめるかも…?

ちなみに、この場合においても【\0】のルールは適用されるので、自動で【\0】が挿入されます。
試しにデバッグで「asdfg」と5文字を入力してみた場合、以下のような処理になっていることがわかります。
m3[0]~m3[4]の5つの変数が使用され、m3[5]に自動で【\0】が挿入されていますね。
未入力で初期化していない変数が「フ」になっているのも併せて確認できます。
この場合、【\0】で文字列の終わりを告げているので、[6]以降は未使用というだけの話になり、特にエラーは発生しません。
予め多めに入れ物を用意しておいて、入れ物が余ったというだけの話ですからね。

図5

その為、このプログラムだと実際は19文字しか入力できません
20文字入力してみると、デバッグエラーが発生します。

図6

以上、C言語/char型と配列変数を組み合わせて文字列を作る方法についての説明でした。