2 ASCII コードと文字型変数

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)
\b(backspace)
:警報音(ピーとかピッとか。機械によって違う)を 1 回鳴らす。
:直前の位置へ移動する。
\t(horizontal tab)
\n(new line)
\r(carriage return)
SP(space)
:次の水平タブ位置へ移動する。
:改行して、次の行の先頭へ移動する。
:現在の行の先頭位置へ移動する。
:スペース
なお、\f,\v はプリンタへの出力で用いられるので説明は略。
また、128~255 までは半角カタカナなどが割り当てられているが、機種によって違う。半角カ
タカナを使うと文字化けを起こすことがあるのは、この為である。
次のプログラムを実行してみよう(イヤホンを付けること。ボリューム注意)。
#include <stdio.h>
main()
{
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 文字文とする。
#include <stdio.h>
main()
{
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 コードを数字で入力するか、代入したい文字(一文字)
を「’」(シングルクオーテーション)でくくる。
#include <stdio.h>
main()
{
char ch = „b‟;
printf(“ch = %c¥n”, ch);
printf(“ch = %d¥n”, ch);
}
実行結果
b
98
実行結果からも分るとおり、%c で指定すると文字を、%s で指定すると数字(文字の ASCII
コード)を表示する。
また、文字型同士の演算も出来る。
#include <stdio.h>
main()
{
char ch1 = „f ‟;
char ch2 = „c‟;
実行結果
printf(“%d¥n”, ch2 – ch1);
}
printf(“%c¥n”, „a‟ + 4);
-3
printf(“%c¥n”, „1‟ + „3‟);
e
d
「アルファベットの小文字を入力して、それが何文字かを表示せよ(’a’を 1 文字目とする)。
また、その文字の大文字を表示せよ」という問題は、2 通りの書き方が出来る。
#include <stdio.h>
main()
{
char ch;
int num;
printf("アルファベットの小文字を入力して下さい:");
scanf("%c", &ch);
num = ch - 96;
printf("%c はアルファベットの%d 文字目です。¥n", ch, num);
printf("%c の大文字は%c です。¥n", ch, 64 + num);
}
#include <stdio.h>
main()
{
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:#include <stdio.h>
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
Pig
Hotl
BlueMoon
d
・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 行目の計算は間違いではない。コードの数字を使う代わりに、コードが表す文字を使っ
ている。