/* 文字列 1-9.c */
#include <stdio.h>
/* 今回は文字を扱う。文字は文字列(=文字の連なり)として現れるのが普通であるから、この
連なりを一纏めにして扱うのが便利である。つまり、一つの変数名で一つの文字列を扱えれば都合
がいい。その為に配列(一つの変数名で多数のdataを扱う)を使う。
一つの変数には一つの文字しか納められないので、実質的な文字列操作をしようと思えば配列を
使わざるを得ない。
*/
main()
{
char c1='s',c2='c',c3='h',c4='o',c5='o',c6='l';
char c[7];
char str[]="バンザイ!";
char str2[100];
// 様々な形で文字変数を宣言。
/* char c1='s';の様にすると文字の数だけ変数が要るし、各変数に一文字ずつ格納して行かねば
ならない。これを表示して見よう。文字表示には%cを使う。*/
printf("* 文字列を扱う *\n\n");
printf("文字変数を 6つ使用: %c%c%c%c%c%c\n",c1,c2,c3,c4,c5,c6);
/* char c[7];と配列宣言すると、同じ事をするのに変数名は一つで良くなる。文字は同じく各
要素に一つずつ格納しておく(下の一行)。ここで、実際の文字数は 6つなのに配列要素を 7つ
宣言しているのは、文字列終端記号を納めて置く為。一つの変数名で文字列を表す場合には、文
字列終端を示す必要がある。終端記号には数値 0を使う。下では、文字列終端記号としての 0
(数の 0としてではなく)であることを明示する為に、前に \を付けた\0を納めている。数字の
0が文字として扱われる時には、全く別の数値 48になる(文字も数値で納まっている)。
*/
c[0]='S';c[1]='C';c[2]='H';c[3]='O';c[4]='O';c[5]='L';c[6]='\0'; //c[6]=0でも同じ
printf("配列を使うと扱いが楽: %s\n\n",c);
/* 文字列表示には、%sを使う。sは string( 列、連)の意。表記が随分すっきりと楽になる。
変数名は []を付けずに cとだけ書く。
幾ら配列を使っても各要素に文字を個別に入れるのは面倒である。しかし、上の宣言で
char str[]="バンザイ!"; と書いたように文字列をそのまま配列文字変数に納めることが
出来る。宣言時に初期化して文字列を納める場合は、str[]の様に要素数の所は空白にしても
構わない。勝手に要素数が数えられ最後に'\0'が納まる。
また、文字列は宣言時を除けば str[]="バンザイ!"; の様な形では代入する事ができない。
文字列の代入には特別な命令が必要(次回)。
文字列を" "で囲んであるのに注目。文字は' 'で囲み、文字列は" "で囲む。
*/
printf("文字列を扱えるようになった: %s\n\n",str);
printf("[入力文字列を表示]\n何か入力:");
scanf("%s",str2); // scanfで文字入力も出来る(空白は不可)。
/* 入力文字列の長さがどれ位あるか不明なので、ここで使う文字変数の配列要素数は多目に宣言
しておく(str2[]には100確保)。ところで、文字列を scanf();で取りこんでいるのに変数の前
に &が付いていない。
文字列の場合には、str2[0]とか str2[3]の様に要素を指定せずに変数名だけを用いると、文字列
先頭のaddressを指すので、これで構わない。数値変数名の前に &を付けたのと同じ事である。
scanf();は指定したaddressに値を取りこむ命令。
*/
printf("\n入力文字列=%s\n",str2);
printf("入力文字列も扱えるぞ %s %s\n",str,str);
printf("\nEnd\n");
return 0;
}