Comments
Description
Transcript
第13回目授業
プログラミングI 13週目 7章 文字と文字列 p.67 文字の扱い方 • コンピュータ(CPU)で扱える言葉 00110010101011010101010101010 – 0と1のみ • モールス信号(トトツー)の場合 文字 符号 A ・- B -・・・ C -・-・ ・ - 短点 長点 p.67 文字 • 文字(A,B,a,b,1,2・・)はCPUでどのように扱うの か? – 文字を数値に置き換えて使用する!! • A -> 0x41 • a -> 0x6a (0x・・は,16進数を表す) – 表記方法として,アスキーコードが使用される. p.374 ASCIIコード表 下位ビット 上位ビット 0 1 2 3 4 5 6 7 0 NUL DLE SP 0 @ P ` p 1 SOH DC1 ! 1 A Q a q 2 STX DC2 “ 2 B R b r 3 ETX DC3 # 3 C S c s 4 EOT DC4 $ 4 D T d t 5 ENQ NAC % 5 E U e u 6 ACK SYN & 6 F V f v 7 BEL ETB ‘ 7 G W g w 8 BS CAN ( 8 H X h x 9 HT EM ) 9 I Y i y A LF/NL SUB * : J Z j z B VT ESC + ; K [ k { C FF FS , < L \ l | D CR GS - = M ] m } E SO RS . > N ^ n ~ F SI US / ? O _ o DEL Quiz9-1: アスキーコード 以下の設問に答えよ. • 各文字のアスキーコー ドを16進数で答えよ. • 各アスキーコードが 指す文字を答えよ. 文字 アスキーコード アスキーコード 文字 D 0x44 0x21 ! g 0x67 0x40 @ , 0x2C 0x2A * & 0x26 0x6F o スペース(SP) 0x20 0x78 x > 0x3E 0x55 U 文字を表す変数の型 • アスキーコード表 – 7ビットの表 • 文字を表す型 – char型(8ビット) p.68 char型への文字の代入 • char xに,文字(A)を代入する方法 • 方法1 – アスキーコード表を参照する方法 x = 0x41; • 方法2 – 1重引用符を使う方法 • 代入したい文字を1重引用符でくくる. x = ’A’; p.68 printf関数での文字の表示 • フォーマット指定子 %c リスト3.1 #include <stdio.h> int main(void) { char a, b, c; a = 'x'; b = '1'; c = '%'; printf("%c%c%c¥n", a, b, c); return 0; } char型変数の定義 char型変数への文字の代入 文字の表示 p.71 scanf関数での文字の入力 • フォーマット指定子 %c サンプルプログラム #include <stdio.h> int main(void) { char a; scanf("%c", &a); return 0; } p.68 文字の取り扱い リスト3.1 (改1) #include <stdio.h> int main(void) { char a, b, c; a = 0x78; b = 0x62; c = 0x63; printf("%c%c%c¥n", a, b, c); return 0; } リスト3.1 (改2) #include <stdio.h> int main(void) { printf("%c%c%c¥n", 'x', '1', '%'); return 0; } リスト3.1 (改3) #include <stdio.h> int main(void) { printf("%c%c%c¥n", 0x78, 0x62, 0x63); return 0; } p.68 文字の取り扱い • 文字は数値で表現されるので, 数値計算を適用できる. • たとえば – a = '1' + '2'; 1. 2. 3. 4. 文字の1と文字の2の足し算 アスキーコード表より,'1'は0x31,'2'は0x32 0x31 + 0x32 = 0x63 0x63は文字cに相当 アスキーコード表では,1+2=cになる p.71 文字の取り扱い • 文字の数値計算の例 – 小文字を大文字に変換する • アスキーコードで考えると,次のように表現される – 大文字は0x41から0x5A – 小文字は0x61から0x7A • すなわち小文字のアスキーコードに対して, 0x20(= 'a' – 'A')を引くと大文字のアスキーコードとなる. – – – – 例 小文字aの場合 小文字mの場合 小文字zの場合 0x61 - 0x20 = 0x41 ('A') 0x6D - 0x20 = 0x4D ('M') 0x7A - 0x20 = 0x5A ('Z') 文字でよく扱われる例題なので,よく練習しておくこと Quiz9-2: 文字の変換 下記はscanfで入力された1文字を,小文字の場合,大文字に変換, printfで出力するプログラムである.空白部を埋めよ. #include <stdio.h> int main(void) { char c; ① printf("input 1 character¥n"); ② scanf("%c", &c); if(c >= 'a' &&③c <= 'z') { c = c -④ 0x20; } printf("%c¥n", ⑤ c); return 0; } ① 文字を格納する変数cの定義 ② scanf関数を用いたcへの文字入力 ③ cが小文字(アスキーコードが'a'以 上かつ'z'以下)の時に真となるif文 ④ 変数cの値を大文字に変換 ⑤ printf関数を用いた変数cの 文字出力 p.250 文字列 • 文字列とは複数の文字(数字)が連なったもの – 複数の数字を格納できるchar 型配列で扱う – 文字列"HELLO"をchar型配列str[10]に格納する例 char str[10]; str[0] str[1] str[2] str[3] str[4] str[5] str[6] str[7] str[8] str[9] 格納前 不定 不定 不定 不定 不定 不定 不定 不定 不定 不定 格納後 0x48 0x45 0x4c 0x4c 0x4F 不定 不定 不定 不定 不定 文字列の終端が不明 文字列 • 文字列の終端文字の導入 – NULL文字(アスキーコード ‘¥0',0x00) – 文字列の最後にNULL文字を入れる • 文字列を格納するときに必要な配列の要素数は 「文字数+1」である. – 文字列"HELLO"をchar型配列str[10]に格納する例 str[0] str[1] str[2] str[3] str[4] str[5] str[6] str[7] str[8] str[9] 格納後 0x48 0x45 0x4c 0x4c 0x4F 0x00 不定 不定 不定 不定 重要 文字列 (まとめ) • char型配列で扱う • 文字列の終端にNULL文字(アスキーコー ド ’¥0‘ 0x00)が入る. • 配列の要素数は 文字数 + 1 文字列の扱い リスト7.2 (改) #include <stdio.h> int main(void) { char str[6]; str[0] = 'H'; str[1] = 'E'; str[2] = 'L'; str[3] = 'L'; str[4] = 'O'; str[5] = '¥0'; return 0; } char型配列変数の定義 (文字数5+1) char型配列の各要素への文字代入 最後にNULL文字を代入 文字列の初期化 • 変数定義時に文字列で初期化できる. • 文字列の前後を2重引用符でくくる 配列初期化と同様 に,定義時のみ可能 char str[10] = "HELLO"; • 初期化後の配列の各要素の値 • 終端文字以降は0で初期化される str[0] str[1] str[2] str[3] str[4] str[5] str[6] str[7] str[8] str[9] 0x48 0x45 0x4c 0x4c 0x4F char str[] = "HELLO"; • 配列の要素数を省略できる • 要素数=文字数+1 – 例の場合 要素数は6 0x00 0x00 0x00 0x00 0x00 Quiz9-3: 文字列 • 文字配列を下記のように定義したとき,配列の各要素の値を 16進数で答えよ. – (1) char str[10] = "Test"; str[0] str[1] str[2] str[3] str[4] str[5] str[6] str[7] str[8] str[9] 0x54 0x65 0x73 0x74 0x00 0x00 0x00 0x00 0x00 0x00 – (2) char str[] = "This is"; str[0] str[1] str[2] str[3] str[4] str[5] str[6] str[7] str[8] str[9] 0x54 0x68 0x69 0x73 0x20 0x69 0x73 0x00 未定義 未定義 p.251, p.262 文字列の入出力 • フォーマット指定子 %s • scanf関数での文字列入力の例 – scanf("%s", str); • 文字配列の場合,変数の前の&はつけない • printf関数での文字列出力の例 – printf("%s", str); • 文字配列の場合,配列の添字は指定しない p.251, p.262 文字列の入出力 サンプルプログラム #include <stdio.h> int main(void) { char str[6]; printf("input str: "); scanf("%s", str); scanf関数を用いた文字配列の文字列入力 printf("%s¥n", str); printf関数を用いた文字列の表示 return 0; } char型配列変数の定義 Quiz9-4: 文字列の変換 下記はscanfで入力された文字列を,大文字の場合,小文字に変換, printfで出力するプログラムである.空白部を埋めよ. #include <stdio.h> int main(void) { char str[10]; ① int i; printf("input str: "); scanf("%s", str);② for(i = 0; i < 10; i++) { ④&& str[i] <= 'Z') if(str[i] >= 'A' { ③ + 0x20; str[i] = str[i] } } printf("%s¥n", str); ⑤ return 0; } ① 文字配列を格納する,要素数10の 配列変数strの定義 ② scanf関数を用いた文字配列strへ の文字列入力 ③ 配列strの添え字iの要素が大文字 (アスキーコードが'A'以上かつ'Z' 以下)の時に真となるif文 ④ 配列strの添え字iの要素を小文字 に変換 ⑤ printf関数を用いた文字配列strの 文字列出力 まとめ • 文字は数値(アスキーコード)で扱う • 文字列は,char型配列で扱う • char型配列において,文字列の終端はNULL 文字である – 配列の要素数は,文字数+1