文字列については一旦この回で終わります。
後でまた出てきますので、忘れないようにしてください。
まず↓のプログラムを見てください。
<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文字分あれば足ります。
このような場合、↓のように書き変えることが出来ます。
#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命令を使えば」という話は今は無しでお願いします。
もう一つ、同じように最大文字数を指定せず文字列を作る方法を紹介します。
#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行加えてみます。
#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とは「定数(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は「文字列」とは関係なく他の型でも使えます。
もう少し後に「関数」の説明をしますが、その時にも頻繁に使いますので忘れないでください。