C初級:文字配列での2次元配列イメージ

C言語初級カテゴリのロゴ画像 C言語初級

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のイメージ
C初級:文字配列での2次元配列イメージ

ちなみにシングルクォーテーションを使い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のイメージはこんな感じ
C初級:文字配列での2次元配列イメージ

わたしのコンパイラでは、以下のように表示されてしまった。

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) トマト

コメント

  1. kiryu より:

    kiryuです。電脳産物さんには何回かお世話になっております。
    全角1文字を配列に格納するときは2次元配列を使わなければならないと思います。
    その理由がよく分からないので、教えていただきたいです。
    (全角1文字に使うバイト数が1バイトではないことが関係あるのだとは思うのですが…)

  2. nao より:

    for文使って1行ずつ文字列を代入していくことってできなかったでしたっけ

    • dennou より:

      おはようございます。naoさん。
      質問の意図と合致しているか分かりませんが、scanfを使って文字列をキーボードから代入するならこんな感じで出来ます。

      #include 
      
      int main(void)
      {
          char mojiretu[3][64];
          int i;
      
          for(i=0; i<3; i++){
              printf("? ");
              scanf("%s", mojiretu[i]);
          }
      
          printf("\n入力した文字列\n");
          for(i=0; i<3; i++){
              printf("%s\n", mojiretu[i]);
          }
          
          return 0;
      }

      実行イメージ

      ? Hello   
      ? Tomato
      ? summer
      
      入力した文字列
      Hello
      Tomato
      summer

      関係ないですが、ついでに同記事内容も見直して説明不足な箇所を更新してみました。
      上記コード含めサンプルコードを2つ同記事に追加しました。たまに過去記事を見直すのもいいですね!

タイトルとURLをコピーしました