これまでのプログラミングでは数字を主に扱ってきました.
今週は「文字」と「文字列」を取り上げます.
コンピュータ内部は,「0」と「1」の二進法の世界でそのまま文字として扱うことが出来ない.では,どのように文字を表現しているのか?
→コンピュータでは,文字コードを使って英数字をぞれぞれの番号に対応させて管理している.
例えば,下のASCIIコード表を参照.
文字コードを表現するには16進数を用いるのが便利である.下の表では,横が16進数の2桁目,縦が16進数が1桁目を表し,赤字で10進数の値を表記している.
例えば大文字の「A」は,16進数では「0x41(0xは16進数という意)」,10進数では「65」で表される.
これらを覚える必要は無いが,いくつかの特別な意味を持つ文字コード(0x0から00x20までの文字には特別な意味が割り当てられている).
例えば,0x00(NUL)はヌル文字,0x0D(CR)や0x0A(LF)は改行などを知っておくと良い.
【文字コード表】
00 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | |
0 | NUL 0 | DLE 16 | SP 32 | 0 48 | @ 64 | P 80 | ` 96 | p 112 |
1 | SOH 1 | DC1 17 | ! 33 | 1 49 | A 65 | Q 81 | a 97 | q 113 |
2 | STX 2 | DC2 18 | " 34 | 2 50 | B 66 | R 82 | b 98 | r 114 |
3 | ETX 3 | DC3 19 | # 35 | 3 51 | C 67 | S 83 | c 99 | s 115 |
4 | EOT 4 | DC4 20 | $ 36 | 4 52 | D 68 | T 84 | d 100 | t 116 |
5 | ENQ 5 | NAK 21 | % 37 | 5 53 | E 69 | U 85 | e 101 | u 117 |
6 | ACK 6 | SYN 22 | & 38 | 6 54 | F 70 | V 86 | f 102 | v 118 |
7 | BEL 7 | ETB 23 | ' 39 | 7 55 | G 71 | W 87 | g 103 | w 119 |
8 | BS 8 | CAN 24 | ( 40 | 8 56 | H 72 | X 88 | h 104 | x 120 |
9 | HT 9 | EM 25 | ) 41 | 9 57 | I 73 | Y 89 | i 105 | y 121 |
A | LF 10 | SUB 26 | * 42 | : 58 | J 74 | Z 90 | j 106 | z 122 |
B | VT 11 | ESC 27 | + 43 | ; 59 | K 75 | [ 91 | k 107 | { 123 |
C | FF 12 | FS 28 | , 44 | < 60 | L 76 | \ 92 | l 108 | | 124 |
D | CR 13 | GS 29 | - 45 | = 61 | M 77 | ] 93 | m 109 | } 125 |
E | SO 14 | RS 30 | . 46 | > 62 | N 78 | ^ 94 | n 110 | ~ 126 |
F | SI 15 | US 31 | / 47 | ? 63 | O 79 | _ 95 | o 111 | DEL 127 |
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);
}
参考:書式指定子
記号 | 意味 |
---|---|
%d | 整数(10進数) |
%o | 整数(8進数) |
%x | 整数(16進数) |
%f | 浮動小数点(実数) |
%c | 文字(1文字) |
%s | 文字列(1文字以上) |
ここまでで,コンピュータ内では文字は数字として扱われ,文字コード表を変換テーブルとして数値と文字が関連付けられていることが分かった.
では,以下のように文字に加算を行うとどうなるか.各自,確認してください.
char a = 'd'; /* 文字型の変数 a */
a++; /* a に 1 を加算 */
printf("%c",a);
前章で「文字」即ち1文字の扱いを学んだ.では複数の文字を扱うにはどうするか.
→文字の配列=「文字列」を用いる.
参考:情報処理・演習1 配列のページ
文字列をC言語プログラム中で記述するためには,表現したい文字の並びをダブルクオーテーション「”」で囲む.
例:"ABC"(単にABCと書くと,変数名とみなされる)
文字の配列を扱うには,文字列を構成する文字のほかに,文字の最後に終端文字として ¥0 (NULL文字,ヌル文字と言う.文字コードでは0x00)を配する規則になっている.
したがって文字型の配列のサイズは,文字数+1,即ち余分に1文字分用意する必要がある.
このことに注意して,文字列を宣言,初期化するには,必要な文字数+1の配列を確保する必要がある.
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, 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
とはならないことに注意!
その理由は後日行うポインタの演習で判明!
(1)キーボードからアルファベットの小文字を 1 文字入力(前述のgetchar()関数を使おう)すると,大文字に変換して画面に表示するプログラムを作成せよ.
ヒント:
・まず入力された文字が小文字かどうかの判定を行おう.
・文字コード表をよく見ると,ABC... , abc... と規則的に並んでいる.
(2)以下の暗号化を行うプログラムを作成せよ.文字列はプログラム中で定義してよい.
(変換前)abc→(変換後)efg
(変換前)XyZ→(変換後)BcD
ヒント:アルファベットで四文字ずらす.
(3)キーボードから文字列を入力すると何文字入力されたかを画面に表示するプログラムを作成せよ.
ヒント:文字列の終わりには,必ず null文字(¥0,0x00)が置かれている.
(4)キーボードから入力した文字列をアルファベット順に並び替えるプログラムを作成せよ.
授業終了時までのプログラムと完成した提出用プログラムをoh-meijiシステムを使って提出すること.
授業終了時に送るのは出席の確認用であり,完成した課題は提出用の回に送ること.
(提出期限を厳守し,提出用の回に提出しないと採点を行わない)
また提出の行い方については,以下のページを参照してください.
課題の提出方法