文字の取り扱い

文字の取り扱い

ここではプログラムにおける文字の取り扱いを解説します。

また、文字列を操作する様々な関数についても紹介します。

文字コード

プログラムでは文字は数値で表されます。

例えば、 「a」なら「97」、「c」なら「99」といった具合です。 数値と文字との対応はASCIIコード(アスキーコード)にまとめられています。

以下にASCIIコードを示します。

10進 16進 文字
0 0x00 NUL(null文字)
1 0x01 SOH(ヘッダ開始)
2 0x02 STX(テキスト開始)
3 0x03 ETX(テキスト終了)
4 0x04 EOT(転送終了)
5 0x05 ENQ(照会)
6 0x06 ACK(受信OK)
7 0x07 BEL(警告)
8 0x08 BS(後退)
9 0x09 HT(水平タブ)
10 0x0a LF(改行)
11 0x0b VT(垂直タブ)
12 0x0c FF(改頁)
13 0x0d CR(復帰)
14 0x0e SO(シフトアウト)
15 0x0f SI(シフトイン)
16 0x10 DLE(データリンクエスケープ)
17 0x11 DC1(装置制御1)
18 0x12 DC2(装置制御2)
19 0x13 DC3(装置制御3)
20 0x14 DC4(装置制御4)
21 0x15 NAK(受信失敗)
22 0x16 SYN(同期)
23 0x17 ETB(転送ブロック終了)
24 0x18 CAN(とりけし)
25 0x19 EM(メディア終了)
26 0x1a SUB(置換)
27 0x1b ESC(エスケープ)
28 0x1c FS(フォーム区切り)
29 0x1d GS(グループ区切り)
30 0x1e RS(レコード区切り)
31 0x1f US(ユニット区切り)
32 0x20 (スペース)
33 0x21 !
34 0x22
35 0x23 #
36 0x24 $
37 0x25 %
38 0x26 &
39 0x27
40 0x28 (
41 0x29 )
42 0x2a *
43 0x2b +
44 0x2c ,
45 0x2d
46 0x2e .
47 0x2f /
48 0x30 0
49 0x31 1
50 0x32 2
51 0x33 3
52 0x34 4
53 0x35 5
54 0x36 6
55 0x37 7
56 0x38 8
57 0x39 9
58 0x3a :
59 0x3b ;
60 0x3c <
61 0x3d =
62 0x3e >
63 0x3f ?
64 0x40 @
65 0x41 A
66 0x42 B
67 0x43 C
68 0x44 D
69 0x45 E
70 0x46 F
71 0x47 G
72 0x48 H
73 0x49 I
74 0x4a J
75 0x4b K
76 0x4c L
77 0x4d M
78 0x4e N
79 0x4f O
80 0x50 P
81 0x51 Q
82 0x52 R
83 0x53 S
84 0x54 T
85 0x55 U
86 0x56 V
87 0x57 W
88 0x58 X
89 0x59 Y
90 0x5a Z
91 0x5b [
92 0x5c \
93 0x5d ]
94 0x5e ^
95 0x5f _
96 0x60 `
97 0x61 a
98 0x62 b
99 0x63 c
100 0x64 d
101 0x65 e
102 0x66 f
103 0x67 g
104 0x68 h
105 0x69 i
106 0x6a j
107 0x6b k
108 0x6c l
109 0x6d m
110 0x6e n
111 0x6f o
112 0x70 p
113 0x71 q
114 0x72 r
115 0x73 s
116 0x74 t
117 0x75 u
118 0x76 v
119 0x77 w
120 0x78 x
121 0x79 y
122 0x7a z
123 0x7b {
124 0x7c |
125 0x7d }
126 0x7e ~
127 0x7f DEL(削除)

文字は、charという型で記述します。intのようなものです。 charは0〜127の数字が入ります。

char i;
i=97;

とすれば、iは「a」を意味します。実際に、

char i;
i=97;
printf("%c",i);

とすれば、「a」が表示されます。 いちいち、ASCIIコードを覚えるのは面倒なのですね。 そこで次のような記法があります。

char i;
i='a';

ただ、文字を「’」で囲むだけです。

文字列

一つの文字ではなく複数の文字を扱いたい場合は配列を使います。 例えば、次のように複数の文字を読み取り、出力することができます。

#include <stdio.h>
int main(){
	char str[10];
	int i;
	printf("文字を入力:");
	gets(str);
	for(i=0;str[i];i++){
		printf("%c",str[i]);
	}
	printf("\n");
	return 0;
}

このプログラムでは、getsでstrに入力された文字を記入して、for文で入力した文字を出力してます。

入力されなかったstrの要素は偽になるため、for文を抜けることができます。

文字数が10以上になるとプログラムはおかしくなります。

プログラムの出力例を以下に示します。

文字を入力:テスト
テスト

別の文字列出力方法があります。この方法を使うと以下のようになります。

#include <stdio.h>
int main(){
	char str[10];
	int i;
	printf("文字を入力:");
	gets(str);
	printf(str);
	printf("\n");
	return 0;
}

ただ、printfを使っただけです。これはまた

#include <stdio.h>
int main(){
	char str[10];
	int i;
	printf("文字を入力:");
	gets(str);
	printf("%s",str);
	printf("\n");
	return 0;
}

とも記述できます。

文字列に関する関数

ここで文字列操作に関する関数をいくつか紹介します。

strcpy:文字をコピーする

文字をコピーする際に使う関数です。

strcpy(コピー先の文字列変数ポインタchar*,コピー元の文字列変数ポインタchar*);

例えば

char str[80];
strcpy(str,"test");
printf("%s",str);

というように使います。これによって、testと表示されます。

strcat:文字列をつなげる

文字列同士をつなげる関数です。

strcat(1番目の文字列,2番目の文字列);

が構文です。

char str[80];
strcpy(str,"Hello,");
strcat(str,"world");
printf("%s",str);

なら、Hello,worldが表示されます。

strlen:文字列の長さ

文字列の長さを計算する関数です。

int strlen(文字列);

で使用できます。

int a;
char str[80];
strcpy(str,"abc");
a=strlen(str);
printf("%d",a);

なら、3が表示されます。

 

日本語は英語と違って、文字数が多いです。 ですから、0から127の128だけでは表現できません。 そこで

  • JISコード
  • シフトJISコード

など様々なコードが提案されてきました。いろいろあるので文字化けが起こるわけです。 それは良くないので、統一しようとしてできたのがUnicodeなんですね。

 

著者:安井 真人(やすい まさと)