C++には、ある文字がアルファベットであるかどうかを判別するための専用の関数があります。文字の型がナロー文字であるかワイド文字であるか(あるいは他の文字様値であるか)によって、さらにはロケールをどう扱うかによっていくつかの関数を使い分ける必要があります。

なお、「アルファベット」というのは、’A’~’Z’ の26文字とその小文字だけではありません。例えば、ドイツ語の ‘ß’ やウムラウト付きの母音字、ロマンス語等に見られるアクセント符号付きの母音字等、その他、キリル文字やギリシャ文字等の非ラテン文字、さらにはカナ文字等も含みます。「アルファベット」にどんな文字が該当するかは、その時点でのロケールに依存します。

isalpha関数

isalpha関数は最もシンプルな判別関数です。ほとんどの場合はこの関数を使えば事足りるでしょう。下記のサンプルでは、標準入力から1文字読み込んだあと、それがアルファベットであれば “アルファベット” という文字列を標準出力に書き出しています。注意すべきなのは、isalpha関数に渡す実引数の値は0~UCHAR_MAXの範囲でなければならない点です。下記のサンプルでは、unsigned char型にキャストすることで解決しています。

iswalpha関数

iswalpha関数はisalpha関数のワイド文字版です。下記のサンプルは、isalpha関数のサンプルをそのままiswalpha関数用に書き換えたものです。引数のキャストが必要ないため、見た目はisalpha関数のサンプルよりすっきりしています。

なお、標準準拠度の低い処理系では std::wcin が使えない場合がありますが、ここでの議論の本質ではありません。

isalpha関数テンプレート

最後は、最も汎用性が高いisalpha関数テンプレートです。この選択は、汎用性は高くなりますが、比較的重い処理になりますので、パフォーマンスが要求される場合には不向きです。

isalpha関数テンプレートを使うには、明示的に文字型をテンプレート引数として指定しなければなりません。また、第2引数としてロケールを指定する必要があります。

char16_t型、char32_t型、char8_t型用のisalpha関数は最後の関数テンプレートを使うことになるかと思います。ただ、WindowsでMinGW-w64(およびClang)を使う場合には、std::localeの実装が十分ではなく、コンストラクタを呼び出すと例外が送出されてしまいます。

char16_t型であればwchar_t型と実質的に同じですのでiswalpha関数を流用してもよいでしょう。char32_t型の場合はUTF-16に変換して判定することになりますが、サロゲートペアの場合だけが困ります。char8_t型の場合はisalpha関数を流用してもよいと思います。