上の例では、char型の変数cを宣言し、'A'(文字'A')を値として 設定している。char c; c = 'A';
文字定数として「'」(シングルクォート)を記述したい場合に、 下記のようにしたのでは、文法エラーになる。 (文字定数を「'」(シングルクォート)で囲むため、文字定数のつもりの「'」 (シングルクォート)が文字定数を囲むための「'」(シングルクォート)と解釈 されるためである)
文字定数として「'」(シングルクォート)を記述したい場合は、拡張表記を使っ て'\''とする。char c = '''; /* 文法エラー */
後で説明する文字列定数でも同様の問題があり、その場合は「"」(ダブルクォー ト)を拡張表記として表現する。char c = '\''; /* OK */
char string[] = "I said \"you are right.\""; /* "を含む文字列の場合 */
拡張表記には以下のようなものが存在する。(一部を紹介する)
\n 改行 (new line) \t 水平タブ (horizontal tab) \v 垂直タブ (vertical tab) \b バックスペース (backspace) \a アラート (alert) \' シングルクォート \" ダブルクォート \\ バックスラッシュ(windowsでは円マーク) \? 疑問符
以下のサンプルコードは1文字ずつ表示する プログラムである。
#include <stdio.h> int main(void) { putchar('A'); /* 'A' */ putchar('\t'); /* 水平タブ */ putchar('\''); /* シングルクォート */ putchar('x'); /* 'x' */ putchar('\''); /* シングルクォート */ putchar('\t'); /* 水平タブ */ putchar('B'); /* 'B' */ putchar('\n'); /* 改行 */ }
実行結果は以下のようになる。 水平タブ(文字の間の空白部分)やシングルクォートが表示されている。
A 'x' B ※ 空白部分は水平タブ
0番から31番までと127番は制御文字と呼ばれ、通常の文字とは扱いが異なる。 (文字として表示されない)(0 〜 31および127は制御文字) 32 ' ' 33 '!' 34 '"' 35 '#' 36 '$' 37 '%' 38 '&' 39 ''' 40 '(' 41 ')' 42 '*' 43 '+' 44 ',' 45 '-' 46 '.' 47 '/' 48 '0' 49 '1' 50 '2' 51 '3' 52 '4' 53 '5' 54 '6' 55 '7' 56 '8' 57 '9' 58 ':' 59 ';' 60 '<' 61 '=' 62 '>' 63 '?' 64 '@' 65 'A' 66 'B' 67 'C' 68 'D' 69 'E' 70 'F' 71 'G' 72 'H' 73 'I' 74 'J' 75 'K' 76 'L' 77 'M' 78 'N' 79 'O' 80 'P' 81 'Q' 82 'R' 83 'S' 84 'T' 85 'U' 86 'V' 87 'W' 88 'X' 89 'Y' 90 'Z' 91 '[' 92 '\' 93 ']' 94 '^' 95 '_' 96 '`' 97 'a' 98 'b' 99 'c' 100 'd' 101 'e' 102 'f' 103 'g' 104 'h' 105 'i' 106 'j' 107 'k' 108 'l' 109 'm' 110 'n' 111 'o' 112 'p' 113 'q' 114 'r' 115 's' 116 't' 117 'u' 118 'v' 119 'w' 120 'x' 121 'y' 122 'z' 123 '{' 124 '|' 125 '}' 126 '~'
以下の
プログラムによりASCIIコードの文字一覧が確認できる。
#include <stdio.h> int main(void) { int i, j; printf("ASCII code character table\n"); for (i = 4; i < 16; i++) { for (j = 0; j < 8; j++) printf("%3d '%c' ", i*8+j, i*8+j); printf("\n"); } }
ASCIIコードはアルファベットや数字などの7ビットで表現できる範囲の文字の
みを扱ったコード体系であり、日本語で使用する漢字などの文字は含まれない。
日本語などの文字を扱うには、最低2バイト必要となるため、C言語のchar型で
は表現できない。
日本語を扱える文字コード体系としては、JISコード、シフトJISコード、
日本語EUCコードが存在し、どれも2バイトで1文字を表現する。
他にも日本語以外の中国語、韓国語など全ての言語で使用する文字を統一的に
扱うことを目的に考えられたUnicodeがある。
先に説明したASCIIコード表を見ると、数字('0'〜'9')はひとつづきになって いることが分かる。 これを利用して、数字('0'(文字コード48)〜'9'(文字コード57))から'0'(文字 コード48)を引くことで、数字を0〜9の整数の値とすることが出来る。int v = '8' - '0'; /* 文字'8'が整数値8になる */
以下のサンプルプログラムは入力した文字が数 字だった場合に整数の値に変換するプログラムである。
上記のサンプルプログラムを実行すると以下の出力結果となる。 (斜字体部分はユーザの入力)#include <stdio.h> int main(void) { int v = 0; int c; printf("input number="); while ((c = getchar()) != EOF) { if (c >= '0' && c <= '9') v = v*10 + (c - '0'); /* 1桁ずつ計算 */ else break; } /* 次で紹介するライブラリ関数を使って ↓このように書くことも出来る while ((c = getchar()) != EOF) { if (isdigit(c)) /* isdigit()で数字を判定 */ v = v*10 + (c - '0'); /* 1桁ずつ計算 */ else break; } */ printf("v=%d\n", v); }
input number=124 v=124
以下にこららの関数の使用例を示す。
上記のサンプルプログラムを実行すると以下の出力結果となる。 (斜字体部分はユーザの入力)#include <ctype.h> /* ctype.hをインクルード */ #include <stdio.h> void check_char(char c) { printf("check '%c'\n", c); if (isalpha(c)) { /* アルファベットかどうか */ printf("'%c' is alphabet\n", c); } if (isdigit(c)) { /* 数字かどうか */ printf("'%c' is digit char\n", c); } if (isupper(c)) { /* 大文字かどうか */ printf("'%c' is uppercase char\n", c); printf("lowercase of '%c' is '%c'\n", c, tolower(c)); } if (islower(c)) { /* 小文字かどうか */ printf("'%c' is lowercase char\n", c); printf("uppercase of '%c' is '%c'\n", c, toupper(c)); } if (isspace(c)) { /* 空白文字かどうか */ printf("'%c' is white space\n", c); } printf("\n"); } int main(void) { int c; printf("input character="); c = getchar(); /* 1文字入力 */ check_char(c); /* 入力した文字をチェック */ }
('a'を入力した場合) input character=a check 'a' 'a' is alphabet 'a' is lowercase char uppercase of 'a' is 'A' ('B'を入力した場合) input character=B check 'B' 'B' is alphabet 'B' is uppercase char lowercase of 'B' is 'b' ('7'を入力した場合) input character=7 check '7' '7' is digit char (' '(スペース)を入力した場合) input character= check ' ' ' ' is white space
以下の
サンプルコードは入力した文字を大文字にして出力するプログラムである。
入力した文字をint型の変数cに格納している。
これは上で説明した通り、EOFを区別するためである。
上記のサンプルプログラムを実行すると以下の出力結果となる。#include <stdio.h> #include <ctype.h> int main(void) { int c; while ((c = getchar()) != EOF) /* 入力が終わるまでループ */ putchar(toupper(c)); /* 大文字にして出力 */ }
a quick brown fox jumps over the lazy dog. A QUICK BROWN FOX JUMPS OVER THE LAZY DOG.