これまでは,プログラム中では数字を主に扱ってきました。今週は文字を扱う方法を学習します。
前提知識:「繰り返し」「配列」
キーワード:「文字」「文字型」「文字コード」「文字列」「ヌル文字」
コンピュータの内部では,「0」と「1」の二進法の世界で,文字を直接扱うことが出来ない。そこで,各文字に番号を割り当てて,「**番の文字を表示しなさい」という命令とし,表示する際に番号を文字に変換している。
では,実際にどのようになってるのか,次のプログラムを実行して確かめよう。
#include <stdio.h> void main() { int a; a = 83; printf("数字として:%d¥n", a); printf("文字として:%c¥n", a); }
どのように表示されましたか?
同じ変数を表示してるのに,結果はことなる。たねは,printf文の書式指定子です。%dの時は,変数の値が十進数で,%cの時は,変数の値の番号の文字を,それぞれ表示する。
記号 | 意味 |
---|---|
%d | 整数(10進数) |
%o | 整数(8進数) |
%x | 整数(16進数) |
%f | 浮動小数点(実数) |
%c | 文字(1文字) |
%s | 文字列(1文字以上) |
では,文字と番号の関係を確認しよう。
上のプログラムを参考に,変数の値を十進数で65から90まで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
とはならないことに注意!
その理由は後日行うポインタの演習で判明!
キーボードから文字列を入力すると,何文字入力されたかを画面に表示するプログラムを作成せよ。
ヒント:文字列の終わりには、必ずnull文字(¥0,0x00)置かれている。
文字列を先頭から一文字ずつ確認していき,ヌル文字だったら,その前までが文字列。
課題3のプログラムを応用して,入力した文字列を,反転して表示するプログラムを作成せよ。
例:入力:「This is」,出力:「si sihT」