### char型配列で文字列を表現
char ss[80]; char型の変数80個
strcpy(s, “abcde”); // 文字列を設定
#include <stdio.h> #include <string.h> int main(void){ char s[80]; strcpy(s, "abcde"); printf("%s\n", s); return 0; }
$ ./dev
abcde
C言語では文字列は文字コードの最後に0を付加すると言うルールで配列に格納される。
‘A’,’B’,’C’,0
-> コードが0になるまで何かの処理をする。null characterと言う。その為、0を含めて十分な長さのchar[]配列を確保する必要がある。10文字の場合は、char s[10]ではなく、char s[11]でないと、異常動作の原因になる。
int main(void){ char s[10]; s[0] = 'A'; s[1] = 'B'; s[2] = 'C'; s[3] = 0; printf("%s\n", s); printf("%d %d %d %d\n", s[0], s[1], s[2], s[3]); return 0; }
$ ./dev
ABC
65 66 67 0
s[3] = ‘0’; とすると、以下のような出力になる。
ABC0?B?
65 66 67 48
char型配列の性格を利用すると、以下のような書き方もできる。
int main(void){ char s[10]; strcpy(s, "abcdef"); printf("%s\n", s); s[3] = 0; printf("%s\n", s); return 0; }
$ ./dev
abcdef
abc
※文字をクリアする時は strcpy(s, “”);に加えて、s[0] = 0も。
s[0] = 0 は、s[0] = ‘¥0’;でも表現できる。
意味合いは同じだが、s[0] = 0 は、0を代入しているみたいなので、s[0] = ‘¥0’の方がよく使われる。
int main(void){ char s[10]; strcpy(s, "abcdef"); printf("%s\n", s); s[3] = '\0'; printf("%s\n", s); s[3] = 'X'; printf("%s\n", s); s[0] = '\0'; printf("%s\n", s); return 0; }
$ ./dev
abcdef
abc
abcXef
### 変数の初期化
int main(void){ char c = 'A'; int i = 1234; double d = 3.45; printf("c=%c\n", c); printf("i=%d\n", i); printf("d=%f\n", d); return 0; }
$ ./dev
c=A
i=1234
d=3.450000
– 配列の初期化
int a[5] = {11, 12, 13, 14, 15};
double b[5] = {10.1, 10.2, 10.3, 10.4, 10.5};
int a[] = {10, 20, 30}; // 初期化する際に省略できる
int a[3] = {10, 20, 30}; // 上と同じ
int a[2][3] = {{10, 20, 30}, {40, 50, 60}};
– 文字配列の初期化
char s[5] = {65, 66, 67, 68, 0}; // 直接数値を書く
char s[5] = {‘A’, ‘B’, ‘C’, ‘D’, ‘\0’}; // 文字定数をかく
char s[5] = “ABCD”; // 文字列で初期化
char e[] = “abcd”; // 省略可
char e[5] = “abcd”;
char s[80] = “aaaa”;
s = “bbbb”; // !エラー
strcpy(s, “bbbb”) // 初期化以外の文字列設定にはstrcpyを使う
### 初期化をしなかった場合
グローバル変数は0系の値に、ローカル変数は不定値になるとされている。
int gdt; int main(void){ int ldt; printf("%d\n", gdt); printf("%d\n", ldt); return 0; }
$ ./dev
0
0
文字列の配列で、’0’を終端とする思想は面白い。確かに、nullや空白だと、英語を始め、あらゆる言語でセンテンスが成り立たなくなる。
それと、プログラミング学習はC言語から学ぶと良いというが、スクリプト言語->C言語の順番が必ずしも駄目って訳ではなさそうに感じる。