C言語の文字列と配列

### 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言語の順番が必ずしも駄目って訳ではなさそうに感じる。