第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