今週から,新しい学習を始めます。これまでは,プログラム中では数字を主に扱ってきました。今週は文字を扱う方法を学習します。
前提知識:「繰り返し」「配列」
キーワード:「文字」「文字型」「文字コード」「文字列」「ヌル文字」
コンピュータの内部では,「0」と「1」の二進法の世界で,文字を直接扱うことが出来ない。そこで,各文字に番号を割り当てて,「**番の文字を表示しなさい」という命令とし,表示する際に番号を文字に変換している。
では,実際にどのようになってるのか,次のプログラムを実行して確かめよう。
#include <stdio.h> void main() { int a; a = 83; printf("数字として:%d¥n", a); printf("文字として:%c¥n", a); }
どのように表示されましたか?
同じ変数(83)を表示してるのに,結果は異なる。種は,printf文の書式指定子です。%dの時は,変数の値が十進数で,%cの時は,変数の値の番号の文字を,それぞれ表示する。
記号 | 意味 |
---|---|
%d | 整数(10進数) |
%o | 整数(8進数) |
%x | 整数(16進数) |
%f | 浮動小数点(実数) |
%c | 文字(1文字) |
%s | 文字列(1文字以上) |
では,文字と番号の関係を確認しよう。
上のプログラムを参考に,変数の値を十進数で97から122まで1ずつ変化させていったとき,対応する文字を表示するプログラムを作成しなさい。
<注意> 1から変数を変化させると,大変な事になります。
文字と番号の関係は,下の表(文字コード表)のようになっている。例えば大文字の「A」は,十進数では「65」で表される。この表を覚える必要はない。
文字 | A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
K |
L |
M |
N |
O |
P |
Q |
R |
S |
T |
U |
V |
W |
X |
Y |
Z |
番号 | 65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
文字 | a |
b |
c |
d |
e |
f |
g |
h |
i |
j |
k |
l |
m |
n |
o |
p |
q |
r |
s |
t |
u |
v |
w |
x |
y |
z |
番号 | 97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
C言語で「文字」といえばアルファベット半角文字の事で,これを格納するための変数がchar型である。
文字をプログラム中で用いるときは,シングルクォーテーションで囲む。(例:'A')
[注意]: 文字型charには,半角1文字だけしか代入できない.また,ひらかなや漢字の代入などもできない.
以下のプログラムで文字コードを確認してみてください.
例:文字コードの値を表示するプログラム
#include <stdio.h>
void main()
{
char c; /* 文字型の変数 */
printf("1文字入力してください");
c = getchar(); /* キーボードからの半角文字1つの入力を得て,char型を返す関数.scanfの代わり */
printf("文字は %c です.¥n", c);
printf("文字コードは %d です.¥n", c);
}
上のプログラムを用いて,アルファベット以外の文字(#や@など)の文字コードを調べ,文字と対応するコードを5組以上,答えなさい。
ここまでで,1文字の扱いを学んだ。次に,複数の文字を扱う。
複数の文字を集合として扱うには,文字の配列=「文字列」を用いる。
参考:情報処理・演習1 配列のページ
文字列をC言語プログラム中で記述するためには,表現したい文字の並びをダブルクオーテーション「”」で囲む.
例:"ABC"(単にABCと書くと,変数名とみなされる)
文字の配列を扱うには,文字列を構成する文字のほかに,文字の最後に終端文字として ¥0 (NULL文字,ヌル文字と言う.文字コードでは0x00)を配する規則になっている。
したがって文字型の配列のサイズは,文字数+1,即ち余分に1文字分用意する必要がある。
このことに注意して,文字列を宣言,初期化するには,必要な文字数+1の配列を確保する必要がある。たとえば,「ABCD」の4文字をしまう文字列変数を定義するには,以下のようになる。
char a[5] = "ABCD";
または,配列の要素数を省略すると,コンパイラにより自動的に「文字数+1」個の配列が用意される。
char a[] = "ABCD";
#include <stdio.h>
void main()
{
char a[] = "ABC012"; /*ダブルクオーテーションに注意*/
int i;
printf("文字列は%sです¥n", a); /*文字列をすべて表示する.配列の最後の¥0は表示されない!*/
for(i=0; i<6; i++) {
printf("%d文字目は%cです.文字コードは十進数で%d,16進数で 0x%x です.¥n", i+1, a[i], a[i], a[i]);
/* %c は文字として表示,%dは十進数として,%xは16進数としてそれぞれ表示する */
}
}
scanf
関数を用いて,キーボードから文字列を入力する方法をマスターしよう。
#include <stdio.h>
void main()
{
char str[100]; /* ヌル文字を除く 99 字分の文字の配列を確保 */
printf("文字を入力してください:");
scanf("%s", str); /* ここに注意,strに&がつかない! */
printf("入力された文字列は%sです¥n", str);
}
上記のようにすると,scanf
が配列 str の先頭から順にキーボードから入力した文字を格納し,最後にヌル文字を加えてくれる。scanf
で文字列を入力する場合は,int, float
型変数への入力と異なり,&str
とはならないことに注意!
その理由は後日行うポインタの演習で判明!
上記のプログラムを作成し,キーボードからいろいろな文字列を入力してみよう。ここで,100文字以上入力するとどうなるか,また,日本語を入力するとどうなるか等,試してみる。
キーボードから文字列を入力すると,何文字入力されたかを画面に表示するプログラムを作成せよ。
ヒント:文字列の終わりには、必ずnull文字(¥0,0x00)置かれている。
文字列を先頭から一文字ずつ確認していき,ヌル文字だったら,その前までが文字列。