C言語学習ポータル(無料版) 学習コンテンツ 文字列 文字の判定と変換(ctype.h)

🔤 文字列

文字の判定と変換(ctype.h)

無料公開版に収録・読む目安 11分

🎯 ctype.hの判定・変換関数を使って、文字の種類を調べたり大文字小文字を変換できる

「この文字は数字か」「アルファベットか」「大文字に変えたい」——こうした1文字ごとの処理をまとめた道具箱が ctype.h です。

関数調べること
isdigit数字('0'〜'9')か
isalphaアルファベットか
isspace空白・タブ・改行か
isupper / islower大文字か / 小文字か
toupper / tolower大文字に変換 / 小文字に変換

判定関数は「その通りなら0以外、違えば0」を返します。真偽値ではなく int を返す点に注意しつつ、if の条件にはそのまま書けます。

#include <stdio.h>
#include <ctype.h>

int main(void)
{
    char s[] = "a1b2c3!";
    int digits = 0, letters = 0;

    for (int i = 0; s[i] != '\0'; i++) {
        if (isdigit(s[i])) {
            digits++;
        } else if (isalpha(s[i])) {
            letters++;
        }
    }
    printf("数字 %d 個 / 英字 %d 個\n", digits, letters);   // 数字 3 個 / 英字 3 個
    return 0;
}

大文字・小文字の変換

#include <stdio.h>
#include <ctype.h>

int main(void)
{
    char s[] = "Hello, C!";

    for (int i = 0; s[i] != '\0'; i++) {
        s[i] = toupper(s[i]);       // 1文字ずつ大文字に
    }
    printf("%s\n", s);              // HELLO, C!
    return 0;
}

toupper は、アルファベット以外の文字(, や !)をそのまま返してくれます。だから条件分岐なしで全文字に適用できます。「変換できないものは素通し」という設計は、使う側にとってとても親切です。

ここで使っている s[i] != '\0' というfor文の条件は、文字列処理の基本形です(t09-08で詳しく扱います)。判定関数で選び、変換関数で書き換える。この2つを組み合わせるだけで、「英数字だけ残す」「小文字にそろえる」といった処理が書けるようになります。

そもそも何に使うのか

いちばんの用途は入力チェックです。ユーザーが入力した文字列が本当に数字だけでできているかを isdigit で1文字ずつ確かめてから、数値に変換する。この一手間があるかどうかで、プログラムの堅さがまったく変わります。想定外の入力で落ちないプログラムは、たいていこうした地味な確認を積み重ねています。

自分で書かずに標準関数を使う

if (c >= '0' && c <= '9') と自分で書いても同じ判定はできます。実際そのとおりに動きますし、仕組みを理解するうえでは書いてみる価値もあります。それでも実務では isdigit を使ってください。意図が一目で伝わり、書き間違いも起きないからです。

罠・注意

ビット判定は is〜、変換は to〜。名前が素直だから、思い出しやすいよ

まとめ: 文字の種類を調べるのは is〜、変換は to〜。自作の条件式より、意図の伝わる標準関数を選びましょう。

要点まとめ

アプリで演習問題まで解く(無料・登録不要)

この項目に出てくる用語

文字列もじれつ

文字が連なったデータのこと。C言語ではchar型の配列として表現され、その末尾には終わりを示す番人の文字が置かれる。"Hello"のようにダブルクォートで囲んで書くのが文字列リテラル。

for文ふぉーぶん

「初期化・条件・更新」の3つを1行にまとめて書ける繰り返し構文のこと。回数があらかじめ決まっている繰り返しにとくに向いている。繰り返す回数があらかじめはっきりしている場面で、とくに書きやすい構文。

同じトラックのほかの項目

文字列とはchar配列であるCの文字列がchar配列であることを理解し、宣言・表示・1文字ずつのアクセスができる ヌル終端 '\0' の掟ヌル終端の役割を理解し、必要な配列サイズを正しく見積もれる 文字列リテラルと初期化文字列の初期化の書き方を使い分け、代入できない理由を説明できる string.h の主要関数strlen・strcpy・strcat・strcmp の役割と使い方を説明できる 安全な文字列操作——バッファサイズの意識バッファオーバーフローの危険を理解し、snprintfやfgetsで安全に書ける 文字コードの基礎——ASCIIとUTF-8文字が数値であることを理解し、文字コードを使った計算ができる 文字列処理の定石パターン文字列を1文字ずつ走査する型を身につけ、数える・削る・逆順にするが書ける
‹ 安全な文字列操作——バッファサイズの意識 文字コードの基礎——ASCIIとUTF-8 ›

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版(BOOTH)を見る

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版 / BOOTH