今回は、「C言語/char型と配列変数を組み合わせて文字列を作る方法」についての説明です。
1.初めに
前回、配列変数とはどんなものなのかを説明しました。
その説明においては、数字を配列していましたので、次は文字の配列について解説していきます。
ただ、文字というとchar型が出てくるのですが、本ブログではchar型については一瞬名前と機能説明が出てきただけで、使用事例をまとめていなかったんですよね。
ということで、今回はchar型の根本的な使い方をまとめつつ、char型と配列変数を組み合わせて文字列を作る方法について解説していきます。
2.char型の補足説明
まずはchar型の補足説明から入ります。
ちょっとルールが変わるだけで、本ブログで散々使ってきたint型と同じようなものということですね。
3.char型と配列変数の組み合わせ
charは1文字だけ入力できる入れ物を作る関数だとわかりました。
ですが、何らかの方法で文字を連続で並べることができるのなら、それは文字列になりますよね?
ということは、charと配列を組み合わせれば文字列って作れるんですよ。
方法はいくつか存在しますので、順番に見ていきましょう。
文字列の作り方①
まずは以下のようなプログラムを書いてみます。
#include<stdio.h>
void main() {
char m1[4] = { ‘a’,’b’,’c’,’\0′ };
printf(“%s”, m1);
}
【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);
}
[]の中に添え字を入力しない場合、続いて入力した分だけ配列変数を定義・初期化すると前回説明しました。
なので、【mojiretsu】の9文字文の配列変数が作られるわけです。
このプログラムを実行すると、【mojiretsu】と表示されます。
ただ、「文字列の作り方①」で、文字列の終わりを意味する【\0】の話をしましたよね?
ここの事例では、見ての通り【\0】が存在しません。
この場合、『文字列として成り立たないのでは?』と思うかもしれませんが、自動的に最後に【\0】が挿入されて処理されるという決まりになっていますので、気にしなくてOKです。
実際、デバッグをして処理内容を確かめてみると、一番最後に【\0】に値する処理が行われていることがわかります。
[9]の処理のことです。
何故か【\0】という表記ではなくバックスラッシュに0がくっついていますが、これが【\0】に該当しています。
ちなみに、【”mojiretsu”】のところを中括弧で囲んで【{“mojiretsu”}】と入力しても、同様の結果が得られます。
そもそも文字は「’」で囲むルールだったのに、なんで「”」になっているんでしょうね?
文字列の作り方③
今度は、scanfと組み合わせてキーボード入力した文字列を出力してみます。
#include<stdio.h>
void main() {
char m3[20];
printf(“文字列を20文字以内で入力してください。”);
scanf(“%s”, m3);
printf(“入力した文字列は%sです。”, m3);
}
8行目では、変数m3[0]~m3[19]が定義されていますが、ここで初期化は行いません。
10行目で登場するscanfは、キーボード入力を促す関数でしたね?
その入力ルールは、過去に以下のように説明しました。
scanf(“変換指定子” , &変数名);
さて、違和感を感じましたでしょうか?
変数名の前の「&」が消えていますね。
配列変数を使用する場合、「&」を付けないルールになっています。
ここは注意が必要です。
何故このようになっているのかは、今は置いておきます。
いつかまとめるかも…?
ちなみに、この場合においても【\0】のルールは適用されるので、自動で【\0】が挿入されます。
試しにデバッグで「asdfg」と5文字を入力してみた場合、以下のような処理になっていることがわかります。
m3[0]~m3[4]の5つの変数が使用され、m3[5]に自動で【\0】が挿入されていますね。
未入力で初期化していない変数が「フ」になっているのも併せて確認できます。
この場合、【\0】で文字列の終わりを告げているので、[6]以降は未使用というだけの話になり、特にエラーは発生しません。
予め多めに入れ物を用意しておいて、入れ物が余ったというだけの話ですからね。
その為、このプログラムだと実際は19文字しか入力できません。
20文字入力してみると、デバッグエラーが発生します。
以上、「C言語/char型と配列変数を組み合わせて文字列を作る方法」についての説明でした。