• 検索結果がありません。

Cプログラミング Ⅱ 文字(復習)

N/A
N/A
Protected

Academic year: 2021

シェア "Cプログラミング Ⅱ 文字(復習)"

Copied!
14
0
0

読み込み中.... (全文を見る)

全文

(1)

CプログラミングⅡ

文字列とポインタ

(2)

文字(復習)

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

(3)

文字列とは(復習)

複数の文字の並び

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文字)を入れる

(4)

文字データのまとめ(復習)

文字データ

1文字のデータ

1重引用符(

' ' )で囲む

文字列データ

複数の文字データ

2重引用符(

" " )で囲む

最後の要素にはNULL文字(

'¥0'

)が入る

※ 'H' と

"H" とは違うことに注意

str str[0] str[1]

'H' '¥0'

' H ' は1個の文字データ

'H'

"H" は ' H ' と ' ¥0 ' からなる文字列

(5)

文字列の扱い(復習)

文字列の最後に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*

(6)

文字列は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;

} ポインタで文字列の出力もできる

(7)

'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

(8)

文字列とポインタ

ポインタに直接文字列を代入した場合も,最後に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

(9)

文字列の扱いにおける配列とポインタの違い

配列に対して

" " を使って文字列を初期化したあと,あらためて

" " を使って文字列全体を配列に代入することはできない

int main(void) {

char str[10] = "Hello";

str = "GoodBye";

str[0] = 'G';

str[1] = 'o';

:

str[6] = 'e';

str[7] = '¥0';

return 0;

}

配列名による文字列の代入はできない

1文字ずつ代入しなければならない

(10)

文字列の扱いにおける配列とポインタの違い

ポインタに対して

" " を使って文字列を初期化した場合,さらに

" " を使って文字列を代入することができる

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

(11)

文字列の扱いにおける配列とポインタの違い

文字列を入力する場合には,文字列を格納するためのデータは ポインタではなく配列で宣言しておく必要がある

char str[100];

scanf("%s", str);

char *str;

scanf("%s", str);

配列で宣言

ポインタで宣言

[ ]のなかには文字数を必ず記述する

ポインタ宣言ではキーボードからの 入力はできない

(12)

文字列配列の配列

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です.

(13)

文字列ポインタの配列

ポインタの配列を用いて,複数の文字列をまとめて扱う こともできる

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です.

(14)

文字列を扱う上での注意

文字列を複数扱うときには,ポインタではなく配列を 用いること

文字列配列の配列により複数の文字列を扱う場合も,

ポインタ配列ではなく2次元配列を用いること

ポインタを用いて複数の文字列を扱おうとすると 文字列の各文字データを格納するためのメモリが 確保できなくなり,プログラム処理が不安定になる

参照

関連したドキュメント

管理画面へのログイン ID について 管理画面のログイン ID について、 希望の ID がある場合は備考欄にご記載下さい。アルファベット小文字、 数字お よび記号 「_ (アンダーライン)

奥付の記載が西暦の場合にも、一貫性を考えて、 []付きで元号を付した。また、奥付等の数

奥付の記載が西暦の場合にも、一貫性を考えて、 []付きで元号を付した。また、奥付等の数

名      称 図 記 号 文字記号

従来から iOS(iPhone など)はアプリケーションでの電話 API(Application Program

“〇~□までの数字を表示する”というプログラムを組み、micro:bit