<STEP1>
文字列の扱い方
他の言語では、「文字列型の変数(String型)」というものが存在して、文字列をそのまま変数に代入することができますが、C言語では、文字列型の変数は存在しません。
C言語では、char型の配列に代入することで、文字列を扱うことができます。
それでは、代入の方法を確認してみましょう。
int main(){
char c1[100] = "banana”; //①文字数以上の配列を準備する
char c2[7] = "banana"; //②文字数+1個の配列を準備する
//char c3[6] = "banana"; //③ 文字数の配列を準備すると、エラーになる
char c4[] = "banana"; //④配列の個数は宣言しなくてもOK
char* c5 = “banana”; //⑤文字列の場所を指し示すポインタを扱うこともできます
printf("%s,%s,%s,%s",c1,c2,c4,c5);
c5 = “apple”; //⑥文字列の場所を「apple」が入っているアドレスに変更できます
printf("%s,%s,%s,%s",c1,c2,c4,c5);
}
①、②、④の方法で、文字列の配列の初期化を行うことはできますが、③のように文字数と同じ個数の配列を初期化すると、エラーが生じます。
また、⑤のように、文字列の場所を指し示すポインタを扱うこともできます。
⑥のように、「banana」をさしていたc5のポインタを「apple」をさすように変更することもできます。
文字列の配列には、ヌル文字と呼ばれる「\0」という文字列が入っていないといけないという決まりがあるからです。
①のように、文字数以上の配列を宣言した場合、自動的に文字の入っていない配列には、「\0」が入る仕様になっています。print文で配列を読みこむ際は、「\0」の1つ手前の文字まで読んでくれます。
<STEP2>
------おさらい------
int*型の変数「pnum1」を宣言し、pnum1が指し示すアドレスを、num1からnum2に変更し、どんな値が表示されるかを確認するプログラムです。
#include <stdio.h>
int main(){
int num1 = 2;
int num2 = 45;
printf("%p, %p\n",&num1, &num2);
int* pnum1 = &num1;
printf("%d, %d, %d\n", num1, num2, *pnum1);
pnum1 = &num2;
printf("%p, %p\n",&num1, &num2);
printf("%d, %d, %d\n", num1, num2, *pnum1);
}
上のように、int型の変数でやったことと同じことを、char型の配列でやってみましょう。
#include <stdio.h>
int main(){
char c1[10] = "banana";
char c2[10] = "apple";
printf("%p, %p\n",c1,c2);
char* pc1 = c1;
printf("%s, %s, %s\n", c1, c2, pc1);
pc1 = c2;
printf("%p, %p\n",c1,c2);
printf("%s, %s, %s\n", c1, c2, pc1);
}
ちょっと変化させてやってみましょう。
#include <stdio.h>
int main(){
char c1[100] = "I have a banana.";
char* pc1 = c1;
char* pc2 = &c1[7];
printf("%s\n", pc1);
printf("%s\n", pc2);
}
pc2は、c1[7]である、8番目の文字「a」のアドレスが入ります。
したがって、pc2の先頭は「a」として認識され、「a banana.」が出力されるわけです。
<STEP3>
文字列の連結と、%sを使わずに%cを使って1文字ずつ文字を出力する方法について確認しましょう。
#include <stdio.h>
int main(){
char c[100] = "I" " have" " a" " banana.";
char* pc = "You" " have" " an" " apple.";
printf("%s\n", c);
printf("%s\n", pc);
int t = 0;
while(c[t] != '\0'){
printf("%c",c[t]);
t++;
}
printf("\n");
int i = 0;
while(pc[i] != '\0'){
printf("%c",pc[i]);
i++;
}
printf("\n");
return 0;
}