1次元配列で文字列を表す
通常の文字列はC言語の場合、char型の配列として変数に代入できる。
char s[] = “ABCDE”;
上記の場合、「E」の後に「\0」ヌル文字が追加されるため、配列要素数は6となる。
配列要素数の省略は、宣言と同時に文字列代入を行う場合のみ可能である。
もし上記の記述を省略せずに記述すると以下のようになる。(要素数はこの場合6以上である必要がある)
char s[6] = "ABCDE";
char型2次元配列で複数の文字列を表す
C言語で文字列を複数個変数に代入したい場合、2次元配列を使う。
/* 複数個の文字列を代入する */
#include <stdio.h>
int main(void)
{
char s[][4] = {"ABC", "DE", "FGH"};
printf("%s\n", s[0]);
printf("%s\n", s[1]);
printf("%s\n", s[2]);
return 0;
}
実行イメージ
ABC
DE
FGH
上記プログラムを実行した際の配列sのイメージ
ちなみにシングルクォーテーションを使い1文字ずつ代入もできるが、あまり使わない方法だろう。
/* 複数個の文字列を代入する2 */
#include <stdio.h>
int main(void)
{
char s[][3] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
printf("%s\n", s[0]);
printf("%s\n", s[1]);
printf("%s\n", s[2]);
return 0;
}
この場合実行は出来るが、配列s[0]とs[1]は最後にヌル文字が入力されないため、printf関数の表示ではおかしくなる。
この場合配列sのイメージはこんな感じ
わたしのコンパイラでは、以下のように表示されてしまった。
ABCDEFG
DEFG
G
きちんと利用できるようにするためには、こんな風に強制的にヌル文字を追加せねばならない。
/* 複数個の文字列を代入する3 */
#include <stdio.h>
int main(void)
{
char s[][3] = {'A', 'B', '\0', 'C', 'D', '\0', 'E'};
printf("%s\n", s[0]);
printf("%s\n", s[1]);
printf("%s\n", s[2]);
return 0;
}
AB
CD
E
サンプルコード
char型2次元配列を使ったサンプルをいくつか示す。
2次元配列で設定した英単語を全て表示する
char_hairetu1.c
/* 2次元配列にした英単語を全て表示する */
#include <stdio.h>
int main(void)
{
int i;
char tango[][10] = {"Apple", "Kiwi", "Lemon", "Melon", "Orange"};
for(i=0; i<5; i++){
printf("%s\n", tango[i]);
}
return 0;
}
実行イメージ
Apple
Kiwi
Lemon
Melon
Orange
キーボードから入力した文字列を2次元配列に代入する
char_hairetu2.c
#include <stdio.h>
int main(void)
{
char mojiretu[3][64];
int i;
/* キーボードから文字列を入力させる */
printf("単語を入力してね\n");
for(i=0; i<3; i++){
printf("? ");
scanf("%s", mojiretu[i]);
}
/* 入力した文字列を全て表示 */
printf("\n入力した文字列\n");
for(i=0; i<3; i++){
printf("%d) %s\n", i+1, mojiretu[i]);
}
return 0;
}
実行イメージ(青文字は入力した文字列。入力後Enter)
単語を入力してね ? トマト ? Hello ? 消える世界にも私の場所がある 入力した文字列 1) トマト 2) Hello 3) 消える世界にも私の場所がある
「END」が入力されるまで果物名を入力させる(入力MAX:100個)
fruits100.c
#include <stdio.h>
#include <string.h>
#define MAX 100
int main(void)
{
char fruits[MAX][64];
int i, count;
/* キーボードから文字列を入力させる */
printf("好きな果物名を入力してね\n");
for(i=0; i<MAX; i++){
printf("%dこ目: ", i+1);
scanf("%s", fruits[i]);
/* ENDが入力されたら途中で終了 */
if(!strcmp(fruits[i], "END")) break;
}
/* 入力したデータ数 */
count = i;
/* 入力した果物名を全て表示 */
printf("\n入力した果物名\n");
for(i=0; i<count; i++){
printf("%d) %s\n", i+1, fruits[i]);
}
return 0;
}
実行イメージ(青文字は入力した文字列。入力後Enter)
好きな果物名を入力してね 1こ目: バナナ 2こ目: いちご 3こ目: すいか 4こ目: メロン 5こ目: トマト 6こ目: END 入力した果物名 1) バナナ 2) いちご 3) すいか 4) メロン 5) トマト
コメント
kiryuです。電脳産物さんには何回かお世話になっております。
全角1文字を配列に格納するときは2次元配列を使わなければならないと思います。
その理由がよく分からないので、教えていただきたいです。
(全角1文字に使うバイト数が1バイトではないことが関係あるのだとは思うのですが…)
こんにちは、kiryu さん。
全角文字とC言語は色々と問題がありますよね。
理解の手助けになるか分かりませんが、以下記事をアップしましたので参考までにどうぞ。
C初級:日本語などの全角文字をchar型で扱う際のイメージ
上記記事での解説は1次元配列ですが、2次元配列が必要となるのは複数の全角文字を扱う場合と考えてください。
kiryuです。
結構悩んでいましたが理解できました!
ありがとうございましたー
それは良かったです。
for文使って1行ずつ文字列を代入していくことってできなかったでしたっけ
おはようございます。naoさん。
質問の意図と合致しているか分かりませんが、scanfを使って文字列をキーボードから代入するならこんな感じで出来ます。
実行イメージ
関係ないですが、ついでに同記事内容も見直して説明不足な箇所を更新してみました。
上記コード含めサンプルコードを2つ同記事に追加しました。たまに過去記事を見直すのもいいですね!