CプログラミングⅡ
文字列とポインタ
文字(復習)
1文字からなるデータ
データ型は
char
(character
)型文字
int main(void) {
char a, b, c, d, e;
a = 'H';
b = 'e';
c = 'l';
d = 'l';
e = 'o';
printf("%c%c%c%c%c¥n", a, b, c, d, e);
}
a
複数の文字を扱おうとすれば その分のchar型変数を
用意する必要がある
b c d e
'H' 'e' 'l' 'l' 'o'
文字 : ひとつのchar型変数に ひとつの文字データのみ
変換仕様は%c
文字列とは(復習)
複数の文字の並び
char
(文字)型の配列で扱うことのできるデータchar型の配列に文字列を格納
int main(void) {
char str[6];
str[0] = 'H';
str[1] = 'e';
str[2] = 'l';
str[3] = 'l';
str[4] = 'o';
str[5] = '¥0';
}
str[0]
'¥0' (NULL文字)は文字列の最後を表す 文字列を作成するときは最後の要素に
必ず '¥0' を入れなければならない
文字列を格納する配列の要素数は
[文字数+1]だけ用意する必要がある str[1] str[2] str[3] str[4] str[5]
'H' 'e' 'l' 'l' 'o' '¥0'
文字列 : char型の配列要素に1文字ずつ格納 最後の要素に'¥0'(NULL文字)を格納
必ず最後の要素に '¥0'(NULL文字)を入れる
文字データのまとめ(復習)
文字データ
1文字のデータ
1重引用符(
' ' )で囲む
文字列データ
複数の文字データ
2重引用符(
" " )で囲む
最後の要素にはNULL文字(
'¥0'
)が入る※ 'H' と
"H" とは違うことに注意
str str[0] str[1]
'H' '¥0'
' H ' は1個の文字データ
'H'
"H" は ' H ' と ' ¥0 ' からなる文字列
文字列の扱い(復習)
文字列の最後にNULL文字('¥0')があることを利用
文字列を処理するときは要素(1文字)ごとに行う
int main(void) {
char str[6] = "Hello";
int i;
i = 0;
while( str[i] != NULL ){
printf("%c*", str[i]);
i++;
}
return 0;
}
文字列配列の要素が NULL文字('¥0')でない間 繰り返す
'¥0' の代わりに NULL と 書くこともできる
1文字ずつ出力
文字の出力は変換仕様に
%c を用いる
H*e*l*l*o*
文字列はchar型の配列なので,配列をポインタで扱う のと同じように,文字列をポインタで扱うことができる
ポインタを用いた文字列の扱い
配列の先頭要素のアドレスをセット ps = &str[0];
H*e*l*l*o*
Hello
ポインタ演算と間接演算子 * を用いて,
現在ポインタが指している最初の文字 から i 番目の文字を処理していく
int main(void) {
char str[6] = "Hello";
char *ps;
int i;
i = 0;
ps = str;
while( *(ps + i) != NULL ){
printf("%c*", *(ps + i) );
i++;
}
printf("%s¥n", ps );
return 0;
} ポインタで文字列の出力もできる
'o' '¥0'
文字列とポインタ
char型へのポインタに直接代入することで文字列を扱う
こともできる (実際には,先頭文字を指しているだけ)
int main(void) {
char *str = "Hello";
printf("文字列は%sです.¥n", str);
return 0;
}
char型のポインタに 文字列を代入
0x1000 0x1002 0x1004 'H' 'e' 'l' 'l'
文字列はメモリ上の どこかに格納され,
その先頭要素を ポインタstrが指す ポインタstrは
先頭要素の文字‘H’を指す
=
文字列はHelloです.
str
文字列とポインタ
ポインタに直接文字列を代入した場合も,最後にNULL 文字('¥0')があることを利用して,1文字ずつ処理する
int main(void) {
char *str = "Hello";
int i;
i = 0;
while( *(str + i) != NULL ){
printf("%c*", *(str + i));
i++;
}
return 0;
}
ポインタ演算と間接演算子 * を用いて,
現在ポインタが指している最初の文字 から i 番目の文字を処理していく
'o' '¥0' 'H' 'e' 'l' 'l'
str
str+1 str+3 str+5
文字列の扱いにおける配列とポインタの違い
配列に対して
" " を使って文字列を初期化したあと,あらためて
" " を使って文字列全体を配列に代入することはできない
int main(void) {
char str[10] = "Hello";
str = "GoodBye";
str[0] = 'G';
str[1] = 'o';
:
str[6] = 'e';
str[7] = '¥0';
return 0;
}
配列名による文字列の代入はできない
1文字ずつ代入しなければならない
文字列の扱いにおける配列とポインタの違い
ポインタに対して
" " を使って文字列を初期化した場合,さらに
" " を使って文字列を代入することができる
int main(void) {
char *str = "Hello";
printf("strが指す文字列は%sです.¥n", str);
str = "GoodBye";
printf("strが指す文字列は%sです.¥n", str);
return 0;
}
ポインタ str は,"Hello" から
"GoodBye" を指すことになる
'o' '¥0' 'H' 'e' 'l' 'l'
'B' 'y'
'G' 'o' 'o' 'd' e' '¥0'
strが指す文字列はHelloです.
strが指す文字列はGoodByeです.
str
文字列の扱いにおける配列とポインタの違い
文字列を入力する場合には,文字列を格納するためのデータは ポインタではなく配列で宣言しておく必要がある
char str[100];
scanf("%s", str);
char *str;
scanf("%s", str);
配列で宣言
ポインタで宣言
[ ]のなかには文字数を必ず記述する
ポインタ宣言ではキーボードからの 入力はできない
文字列配列の配列
char型の2次元配列を用いて,複数の文字列をまとめて
扱うことができる
int main(void) {
char str[3][20] = { "Hello","GoodBye","ThankYou" };
int i;
for(i = 0; i < 3; i++){
printf("文字列は%sです.¥n", str[i] );
}
return 0;
}
1つの文字列が19文字以内
3つの文字列を扱う
1個ずつ 文字列を
str[0] ← "Hello" 出力
str[1] ← "GoodBye"
str[2] ← "ThankYou"
文字列はHelloです.
文字列はGoodByeです.
文字列はThankYouです.
文字列ポインタの配列
ポインタの配列を用いて,複数の文字列をまとめて扱う こともできる
int main(void) {
char *str[3] = { "Hello","GoodBye","ThankYou" };
int i;
for(i = 0; i < 3; i++){
printf("文字列は%sです.¥n", str[i] );
}
return 0;
}
3つの文字列を指すポインタの配列
1個ずつ 文字列を 出力
文字列はHelloです.
文字列はGoodByeです.
文字列はThankYouです.
文字列を扱う上での注意
文字列を複数扱うときには,ポインタではなく配列を 用いること
文字列配列の配列により複数の文字列を扱う場合も,
ポインタ配列ではなく2次元配列を用いること
ポインタを用いて複数の文字列を扱おうとすると 文字列の各文字データを格納するためのメモリが 確保できなくなり,プログラム処理が不安定になる