★文字と文字列(文字列9)★


文字列については一旦この回で終わります。

後でまた出てきますので、忘れないようにしてください。


まず↓のプログラムを見てください。

<sample program 089-01>

#include <stdio.h>

#define MAX_STRING 10

int main(void)
{
    char str[MAX_STRING] = "ABC";

    printf("%s\n", str);

    return 0;
}

<実行結果>

ABC
続行するには何かキーを押してください・・・

配列strに初期値"ABC"を入れ、表示しているだけのプログラムです。

中身は、

str  0 1 2 3 4 5 6 7 8 9
  +−+−+−+−+−+−+−+−+−+−+
  | A| B| C|\0|\0|\0|\0|\0|\0|\0|
  +−+−+−+−+−+−+−+−+−+−+

こうなっています。

配列strは(ヌル文字を除いて)9文字入る容量がありますが、"ABC"は4文字分あれば足ります。


このような場合、↓のように書き変えることが出来ます。

<sample program 089-02>

#include <stdio.h>

int main(void)
{
    char str[] = "ABC";

    printf("%s\n", str);

    return 0;
}

<実行結果>

ABC
続行するには何かキーを押してください・・・

#defineで最大文字数を定義せず、配列の要素数を書かないまま初期値を入れています。

この場合の中身は、

str  0 1 2 3 
  +−+−+−+−+
  | A| B| C|\0|
  +−+−+−+−+

こうなります。


この考えは「数値」を扱う配列でも同じように使えます。

<sample program 089-03>

#include <stdio.h>

#define MAX_STRING 10

int main(void)
{
    int data[] = { 1, 2, 3 };

    printf("%d\n", data[1]);

    return 0;
}

<実行結果>

2
続行するには何かキーを押してください・・・

ただし、「数値」の場合はこの方法は使わない方が良いと思います。

配列内のデータを全て表示したりすることを考えると、「要素数が3」という情報が必ず必要になるからです。

もし#defineで「要素数が3」ということを定義せずプログラムを組んでいったとします。

組んでいる途中で「やっぱり要素数を4にしよう!」と思った時には、何か所も訂正しなければならなくなります。

「文字列」は後から文字数を取得することも出来ますし、何かあれば文字列の最後にはヌル文字という「番兵」がいますので何とかなりそうです。

※データの最後尾を表すデータを「番兵」と呼ぶことがあります。

※初心者向けですので、「sizeof命令を使えば」という話は今は無しでお願いします。


もう一つ、同じように最大文字数を指定せず文字列を作る方法を紹介します。

<sample program 089-04>

#include <stdio.h>

#define MAX_STRING 10

int main(void)
{
    char* str = "ABC";

    printf("%s\n", str);

    return 0;
}

<実行結果>

ABC
続行するには何かキーを押してください・・・

char* という表現は初めてですよね。

これはポインタ変数と言いますが、詳しいことはまだまだ先になりますので、ここでも説明は割愛します。

とにかく、こうやって書いても文字列を作ることが出来るということです。


作り方が異なることで、動作にも違いがあります。

<sample program 089-02>に1行加えてみます。

<sample program 089-05>

#include <stdio.h>

#define MAX_STRING 10

int main(void)
{
    char str[] = "ABC";

    str[1] = 'Z';

    printf("%s\n", str);

    return 0;
}

<実行結果>

AZC
続行するには何かキーを押してください・・・

配列の1番目を'Z'で書き換えました。

実行結果でも確認出来ます。

次に、<sample program 089-04>にも同じ変更を加えてみます。

<sample program 089-06>

#include <stdio.h>

#define MAX_STRING 10

int main(void)
{
    char* str = "ABC";

    str[1] = 'Z';

    printf("%s\n", str);

    return 0;
}

<実行結果>


続行するには何かキーを押してください・・・

実行時エラーで強制的にプログラムが停止されました。

こちらの方法は、「書き換えてはならない領域」に文字列を作ります。

書き換えようとするとプログラムが停止します。

書き換えてはならないのですが、書き換えようとすることが出来るのです。

そこで、新しい命令を書いておきます。


const


constとは「定数(constant)」という意味です。

変数宣言する際に型名の前に付けることで、その変数は書き換え不能になります。

先ほどのプログラムにも付けてみましょう。

<sample program 089-07>

#include <stdio.h>

int main(void)
{
    const char* str = "ABC";

    str[1] = 'Z';

    printf("%s\n", str);

    return 0;
}

コンパイルの時点でエラーとなります。

  error C3892: 'str': const である変数へは割り当てることはできません

左辺(str[1])はconst指定されているため、代入などの書き換えは出来なくなりました

constは実行時のエラーを防ぐのではなく、コンパイル時点でバグの混入を防ぐための「予防策」として用います。

書き換え不要な変数にはconstを付けるということを覚えておきましょう。


ちなみに、<sample program 089-05>のプログラムにも付けてみましょう。

<sample program 089-08>

#include <stdio.h>

int main(void)
{
    const char str[] = "ABC";

    str[1] = 'Z';

    printf("%s\n", str);

    return 0;
}

コンパイルエラーになりました。

  error C3892: 'str': const である変数へは割り当てることはできません

constは「文字列」とは関係なく他の型でも使えます。

もう少し後に「関数」の説明をしますが、その時にも頻繁に使いますので忘れないでください。


次へ

戻る

目次へ