🇯🇵 日本語 | 🇺🇸 English

第22回 文字(char型)

C言語のchar型(1文字)の基礎。'A'と"A"の違い、ASCIIコード、char=整数の仕組み、scanfでの1文字入力まで。

📖 このページで覚えること
✅ 最低限ここだけ覚える
  • char1 文字 を入れる箱(1バイト)
  • 1 文字は 'A'(シングルクォート)
  • printf("%c", c) で表示 / scanf(" %c", &c) で入力
  • char の実体は整数 (ASCIIコード)
⭐ 余裕があれば読む
  • 大文字小文字変換 c + ('a'-'A')
  • 文字の数字→整数は ch - '0'
  • 日本語は char 1個に入らない

新しい型「char」を学ぶ ― 1 文字を入れる箱

これまでに int(整数)と double(実数)を使ってきましたね。ここで初めて char(チャー)型を学びます。char は 1 文字 を入れる箱です。サイズは 1 バイト。書き方はとてもシンプル:
char c = 'A';          // c に文字 A を入れる
printf("%c\n", c);    // → A   (画面に A が出る)

🎨 ビジュアルで見る ― char は「1 マスの箱」

char c =
'A'
1 バイト
printf("%c", c)
画面出力
A
画面

⚠️ 'A'(シングル)と "A"(ダブル)はまったく別物

同じ A でも、クォートが違うと型も意味も別物です。間違えやすいので最初に押さえましょう。
🔵 'A' ― シングルクォート
A
1 文字(char 型 / 1 バイト)
char c = 'A';
🟠 "A" ― ダブルクォート
A
\0
文字列(char 配列 / 末尾に \0
char s[] = "A";
次回扱う「文字列」は、右の "A" のように char を並べて末尾に \0 を付けたものです。

💡 実は char の中身は「数字」 ― ここからは少し奥の話

使い方の基本は上で全部です。ここから先は 「char はなぜ計算できるのか」 の理由を知りたい人向け。
実は char 型の中身は 1 バイトの整数で、画面に 'A' として見えるのは 「数値 65 を文字として解釈している」だけ なんです。
覚えておくと便利:
char c = 'A';char c = 65;完全に同じ意味
printf("%c", 65) → A / printf("%d", 'A') → 65
・このおかげで 'A' + 1'B' になる、という芸当ができる

ASCII コード早見表

それぞれの文字に「番号」が割り当てられています。大事な文字は 数字 (0〜9)大文字 (A〜Z)小文字 (a〜z) の 3 グループ。

① 制御文字 と 空白(よく使うもの)

文字10進16進説明
\000x00ヌル文字(文字列の終端の目印)
\t90x09水平タブ
\n100x0A改行
320x20半角スペース

② 数字 (10 個)

文字0123456789
10進48495051525354555657

③ 大文字アルファベット (26 個)

文字ABCDEFGHIJKLM
10進65666768697071727374757677
文字NOPQRSTUVWXYZ
10進78798081828384858687888990

④ 小文字アルファベット (26 個)

文字abcdefghijklm
10進979899100101102103104105106107108109
文字nopqrstuvwxyz
10進110111112113114115116117118119120121122
👀 気づき: 大文字 A=65、小文字 a=97。'a' - 'A' = 32 がいつでも成立。これが「大文字 ↔ 小文字 変換」のキーになります。

実例: 文字と数字は行き来できる

#include <stdio.h>

int main(void) {
    char c = 'A';
    printf("c = %c\n", c);     // → A   (文字として表示)
    printf("c = %d\n", c);     // → 65  (整数として表示)

    // 文字の「計算」もできる
    printf("%c\n", c + 1);    // → B   (65+1=66、'B'のコード)
    printf("%c\n", 'Z' - 3);  // → W

    // 65 を char に入れても 'A' と等価
    char d = 65;
    printf("%c\n", d);        // → A
    return 0;
}

定番テクニック

① 大文字 → 小文字 変換
char c = 'A';
char lower = c + ('a' - 'A');   // 'A' + 32 = 'a'
// または: char lower = c + 32;
② 文字の数字を本当の整数に
char ch = '7';            // これは 55 ('7'のASCII)
int n = ch - '0';        // 55 - 48 = 7 (本当の整数7)
printf("%d\n", n);       // → 7
③ 文字の判定(大文字か、数字か)
if (c >= 'A' && c <= 'Z') // 大文字?
if (c >= '0' && c <= '9') // 数字?
// 標準ライブラリ <ctype.h> にも isupper(c), isdigit(c) がある

なぜ char はそもそも整数なのか?

1960年代の ASCII(American Standard Code for Information Interchange)で「英字・数字・記号 = 7bit の数値」という対応表が決められました。C言語はこれを引き継ぎ、文字を整数として扱う設計になっています。この「シンプルな割り切り」が、文字演算を楽にし、Cの大きな特徴になっています。
注意: 日本語は char 1つに入らない
char c = 'あ'; はエラーか警告になります。日本語の1文字は複数バイト(UTF-8 なら 3バイト)必要なので、charの配列で扱うか、wchar_t を使うか、文字コードを自分で扱う必要があります。ASCII の範囲(英数字と記号)だけが char で安全に扱える文字です。
💡 思い出そう ― コンピュータは「数字」しか扱えない
第 1 回でも触れたとおり、コンピュータの中身は 0 と 1(電気の ON / OFF)だけ
画面に 'A''あ' が見えていても、メモリには 結局すべて数値(番号)として保存 されています。char が「実は整数」なのは特別な仕様ではなく、「文字に番号を割り当てた」だけ という当たり前の話です。
この感覚を持っておくと、後で出てくる 文字列・ファイル・通信・画像 なども「結局はバイト(数字)の並び」として理解しやすくなります。

char を scanf で入力する

char の使い方が分かったので、次は キーボードから 1 文字を読み取る 方法を学びます。基本はとても簡単ですが、連続入力でハマる「改行残り」の罠 があるので、後半でそれも押さえます。

基本の使い方

printf と対になるのが scanf。書式は %c(character の c)。int の %d と同じ感覚で、変数の住所 & を渡す のがポイントです。
#include <stdio.h>

int main(void) {
    char c;
    printf("1 文字入力してね: ");
    scanf("%c", &c);          // ← & を忘れない!
    printf("入力された文字: %c\n", c);
    return 0;
}
/* 実行例
   1 文字入力してね: A   ← A を入力して Enter
   入力された文字: A
*/
覚え方:printf("%c", c)表示scanf("%c", &c)入力」。違いは & の有無 だけ。

⚠️ 注意:他の scanf と続けると「改行」が入ってしまう

基本はこれだけですが、2 回以上 scanf を続けて呼ぶ ときに 1 つだけ罠があります。たとえば「数字を読んでから 1 文字を読む」と…
int  n;
char c;
scanf("%d", &n);  // 数字を入力 → Enter
scanf("%c", &c);  // 続けて 1 文字を入力したい… が、うまくいかない!
printf("n=%d c=[%c]\n", n, c);
5 Enter A Enter」と入力したつもりでも、c には 'A' ではなく '\n'(改行)が入ってしまいます。原因は、入力が 「入力バッファ」という見えない待合室 を経由するから。

🔍 何が起きているか ― 入力バッファを覗く

あなたが「5 Enter」と打つと、入力バッファにはこう並ぶ:
5
数字
\n
Enter で入る改行
scanf("%d", &n)5 だけを取り出して n に入れる。改行 \n残ったまま:
5
→ n=5 へ
\n
残ってる!
② 続く scanf("%c", &c)バッファの先頭の 1 文字 を取る。先頭は \n なので…:
\n
バッファ先頭
c = '\n'
意図と違う!
A を入力する前に、c はもう \n で埋まってしまう。

✅ 対策 ― " %c" と先頭スペースを入れる

%c の前に 半角スペース 1 つ を書くと、scanf は 空白文字(スペース・タブ・改行)を全部読み飛ばして から 1 文字を取ってくれます。
int  n;
char c;
scanf("%d", &n);
scanf(" %c", &c); // ← " %c" の先頭スペースが \n を吸収!
printf("n=%d c=[%c]\n", n, c); // → n=5 c=[A]  期待通り!
覚え方: %c の前にはスペースを 1 つ」。これだけで連続入力の改行残り問題がほぼ解決します。
%d%s はもともと先頭の空白を読み飛ばす仕様なので、この問題が起きません。%c だけ別ルール)

関連する講座

入門編
第3回 変数
int・double・char など「型」と変数の基礎。値を入れる箱の考え方。
繰り返し・配列・文字列
第23回 文字列
char を並べて末尾に \0 を付けた「文字列」。strlen・strcpy も解説。
入門編
第4回 printf・scanf
C言語のprintf関数とscanf関数の使い方。書式指定子を一覧で解説。
← 前の講座
第21回 確認問題(配列)
次の講座 →
第23回 文字列

確認クイズ

この講座の理解度をチェックしましょう!

Q1. char c = 'A'; のとき printf("%d", c) の出力は?

A
65
エラー

char の中身は整数(ASCIIコード)です。'A' は 65 なので %d では 65 と表示されます。%c なら A。

Q2. 'A'(シングル)と "A"(ダブル)の違いは?

どちらも同じ1文字
"A" は末尾に \0 が付く文字列(2バイト)
'A' の方がメモリを多く使う

'A' は char 1バイト。"A" は char 配列で 'A' と '\0' の2バイトになります。

Q3. 直前の scanf("%d", &n) のあと、1文字を正しく読むには?

scanf("%c", &c)
scanf(" %c", &c)
scanf("c", &c)

" %c" のように先頭にスペースを入れると、残った改行などの空白を読み飛ばしてから1文字を取れます。

この記事をシェア
X(Twitter)でシェア Facebookでシェア LINEで送る はてブ

この講座の理解を深めるおすすめ書籍

サイトで動きを理解し、書籍で演習量を補うと効果的です

📘
苦しんで覚えるC言語
MMGames 著
初心者向けの定番入門書。丁寧な解説で基礎を固められます。
Amazonで見る
📗
新・明解C言語 入門編
柴田望洋 著
図解が豊富で、演習問題も充実。大学の教科書としても採用多数。
Amazonで見る
📙
プログラミング言語C 第2版
B.W.カーニハン, D.M.リッチー 著
通称K&R。C言語の原典。基礎を終えた後のステップアップに最適。
Amazonで見る

※ 上記リンクはアフィリエイトリンクです。購入によりサイト運営を支援いただけます。