文字がアルファベットかどうかを判別する

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

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

isalpha 関数

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

#include <iostream>
#include <cctype>
 
int main()
{
  char c;
  std::cin >> c;
  if (std::isalpha(static_cast<unsigned char>(c)))
  {
    std::cout << "アルファベット" << std::endl;
  }
}

iswalpha 関数

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

#include <iostream>
#include <cwctype>
 
int main()
{
  wchar_t wc;
  std::wcin >> wc;
  if (std::iswalpha(wc))
  {
    std::cout << "アルファベット" << std::endl;
  }
}

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

isalpha 関数テンプレート

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

#include <iostream>
#include <locale>
 
int main()
{
  char c;
  std::cin >> c;
  std::locale loc;
  if (std::isalpha<char>(c, loc))
  {
    std::cout << "アルファベット" << std::endl;
  }
}

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

トラックバック


URL から "-nospam" を削除してトラックバックを送信してください。
このエントリーを含むはてなブックマーク