2 ASCII コードと文字型変数 2-1 ASCII コード 文字 コードコードコードコードコードコードコードコード文字文字文字文字文字文字文字 10 進 10 進 10 進 10 進 10 進 10 進 10 進 10 進 0 16 SP 32 0 48 @ 64 P 80 ` 96 p 112 1 17! 33 1 49 A 65 Q 81 a 97 q 113 2 18 " 34 2 50 B 66 R 82 b 98 r 114 3 19 # 35 3 51 C 67 S 83 c 99 s 115 4 20 $ 36 4 52 D 68 T 84 d 100 t 116 5 21 % 37 5 53 E 69 U 85 e 101 u 117 6 22 & 38 6 54 F 70 V 86 f 102 v 118 \a 7 23 ' 39 7 55 G 71 W 87 g 103 w 119 \b 8 24 ( 40 8 56 H 72 X 88 h 104 x 120 \t 9 25 ) 41 9 57 I 73 Y 89 i 105 y 121 \n 10 26 * 42 : 58 J 74 Z 90 j 106 z 122 \v 11 27 + 43 ; 59 K 75 [ 91 k 107 123 \f 12 28, 44 < 60 L 76 \ 92 l 108 124 \r 13 29-45 = 61 M 77 ] 93 m 109 125 14 30. 46 > 62 N 78 ^ 94 n 110 ~ 126 15 31 / 47? 63 O 79 _ 95 o 111 DEL 127 \a(alert) : 警報音 ( ピーとかピッとか 機械によって違う ) を 1 回鳴らす \b(backspace) : 直前の位置へ移動する \t(horizontal tab) : 次の水平タブ位置へ移動する \n(new line) : 改行して 次の行の先頭へ移動する \r(carriage return) : 現在の行の先頭位置へ移動する SP(space) : スペース なお \f,\v はプリンタへの出力で用いられるので説明は略 また 128~255 までは半角カタカナなどが割り当てられているが 機種によって違う 半角カ タカナを使うと文字化けを起こすことがあるのは この為である
次のプログラムを実行してみよう ( イヤホンを付けること ボリューム注意 ) printf( a ahello n ); /* 警告音が 2 回鳴った後 Hello と表示される */ printf( Good night b b b b bmorning n ); /* Good morning と表示される */ printf( H te tl tl to n ); /* H e l l o と表示される */ printf( April rmay n ); /* Mayil と表示される */ 最初の printf は問題ないだろう 2 つめは Good night 表示した後カーソルが 5 つ戻って n の位置になり そこから morning を上書きするので Good morning となる 3 つめは 各文字の間にタブが入るので 離れて表示される 最後は April と表示した後 カーソルが先頭の A の位置になり そこから May が上書きされるので Mayil と表示される 問題 2-1 次のプログラムを実行するとどう表示されるか プログラムを実行せずに考えなさい ただし タブはスペース 4 文字文とする printf( Cat b bome bing n ); printf( tdog tpig n ); printf( Cool rhot n ); printf( Blue t bmoon n )
2-2 文字型 文字型 となっているが 実質は整数型で 0~255 または-127~127 までを範囲とする 文字型変数に文字を代入すると 入力した文字の ASCII コードが変数に格納される なお 文字型変数の宣言は char で行う また 文字型変数への代入は ASCII コードを数字で入力するか 代入したい文字 ( 一文字 ) を ( シングルクオーテーション ) でくくる char ch = b ; printf( ch = %c n, ch); printf( ch = %d n, ch); 実行結果 b 98 実行結果からも分るとおり %c で指定すると文字を %s で指定すると数字 ( 文字の ASCII コード ) を表示する また 文字型同士の演算も出来る char ch1 = f ; char ch2 = c ; printf( %d n, ch2 ch1); printf( %c n, a + 4); printf( %c n, 1 + 3 ); 実行結果 -3 e d
アルファベットの小文字を入力して それが何文字かを表示せよ ( a を 1 文字目とする ) また その文字の大文字を表示せよ という問題は 2 通りの書き方が出来る char ch; int num; printf(" アルファベットの小文字を入力して下さい :"); scanf("%c", &ch); num = ch - 96; printf("%c はアルファベットの %d 文字目です n", ch, num); printf("%c の大文字は %c です n", ch, 64 + num); char ch; int num; printf(" アルファベットの小文字を入力して下さい :"); scanf("%c", &ch); num = ch a ; printf("%c はアルファベットの %d 文字目です n", ch, num + 1); printf("%c の大文字は %c です n", ch, A + num); 上は 文字コードの数字を使って計算している 下は 文字そのものを使って計算している 英数字を使っている分にはどちらでも問題ないはずだが 万が一割り当てられたコード番号が違うような場合 下のような書き方をするとコード番号を意識せずプログラムを動かすことが出来る
問題 2-2 次のプログラムの間違いを訂正せよ なお 各行の左端は行番号なので気にしなくてよい 1:/* 入力したアルファベットの小文字を指定した文字数ずらし 2: さらに大文字に変換する暗号を作る */ 3: 4:main 5: 6: chara Cha; /* 入力された文字を格納する変数 */ 7: int shift; /* ずらす文字数を格納 8: imt new_c; /* 変換された文字の文字コードを格納 */ 9: 10: printf( アルファベットの小文字を入力して下さい :); 11: scanf( %d, &cha); 12: printf( 何文字ずらしますか : ) 13: scanf( %d, shift); 14: 15: new_c = (cha + shift a ) / 26 + A ; 16: printf( %c を変換すると %c になります n, &cha, &num);
問題解答 2-1 実行結果 Coming Dog Hotl BlueMoon Pig 1 行目は Cat と出力後 2 つ戻って ome を上書きして Come となり さらに一つ戻って ing を上書きして Coming になる 2 行目は Dog と Pig の前に それぞれタブが入る 3 行目は Cool と出力した後カーソルが先頭に戻って Hot と上書きするので Hotl となる 4 行目は Blue と入力した後タブが入る 次に \b で一文字戻るが タブも 1 文字なので e の次にカーソルが移動する そして Moon が出力されるので 全体で BlueMoon となる 2-2 4 行目 : main の後に() がない 6 行目 : char が chara になっている 7 行目 : コメントの最後の */ が抜けている 8 行目 : int が imt になっている 10 行目 : が抜けている 11 行目 : 文字の入力に %d が使われている 12 行目 : 最後の ; が抜けている 13 行目 : 変数の前の & が抜けている 16 行目 : 変数に & が付いている 最後の が抜けている 変数名を Cha で宣言しているのに cha を使っている 小文字と大文字は区別される なお 15 行目の計算は間違いではない コードの数字を使う代わりに コードが表す文字を使っている