🔤 文字列
🎯 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 を使ってください。意図が一目で伝わり、書き間違いも起きないからです。
罠・注意
int です。toupper の結果を char の変数に入れるのは問題ありませんが、printf で表示するときは %c を使います。if (isdigit(c) == 1) という書き方は避けてください。unsigned char に収まる値か EOF である必要があります。日本語などのマルチバイト文字をそのまま渡すと、環境によって予期しない結果になります。toupper(s[i]); だけ書いても大文字にはなりません。まとめ: 文字の種類を調べるのは is〜、変換は to〜。自作の条件式より、意図の伝わる標準関数を選びましょう。
「初期化・条件・更新」の3つを1行にまとめて書ける繰り返し構文のこと。回数があらかじめ決まっている繰り返しにとくに向いている。繰り返す回数があらかじめはっきりしている場面で、とくに書きやすい構文。
もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。