【問題11】文字列の長さと文字種類の判別:完全マスター! 組み込みC言語プログラミング(12)(4/4 ページ)
C言語を使ったマイコン制御プログラムの“イロハ”を解説する本連載。複数条件を満たすパスワード確認プログラムを通じて、複数関数の使い方とフラグの立て方を学びます。
問題11の解説
それでは問題11の解答例「password.c」の解説をしましょう。問題11で定めるキーワードには、英小文字、英大文字、数字を含む約束になっています。このような問題を解決するテクニックにフラグ(Flag:旗)があります。
ここでは、英小文字、英大文字、数字のフラグを用意して、もし英小文字を発見したら英小文字のフラグを立てます。同様に英大文字のフラグと数字のフラグを機能させて、最後に3つのフラグが立っていたらパスワードとしての条件は満たされることになります。
各フラグは旗が立っているか寝ているかの2値ですから、ビットで割り当てることができます。password.cでは、変数flgの各ビットを、下図のように割り当てています。
さてCプログラムでビットを立てるために、ビット毎の論理OR演算子(|)を使います。
password.cの4行目から7行目の
#define CH_LOWER 1 #define CH_UPPER 2 #define CH_NUMBER 4 #define CH_OTHER 8
で、各ビットがセットされた(フラグが立っている)数値を定義して、20行目から23行目
if (islower(ch)) flg |= CH_LOWER; else if (isupper(ch)) flg |= CH_UPPER; else if (isdigit(ch)) flg |= CH_NUMBER; else flg |= CH_OTHER;
で、chが英小文字だったらビット0をセットし、英大文字だったらビット1を、数字だったらビット2をセットします。
問題11では英小文字、英大文字、数字以外の文字は含まない約束になっているので、それ以外の文字ではビット3をセットし、もしビット3が立っていたらパスワードとは認めません。
26行目のif文
if ((flg == CH_WORD) && (len >= 6 && len <= 12))
がその判定で、問題11のパスワードの条件である
- 英小文字・英大文字・数字を少なくとも1文字含むこと
- 英数字以外の文字が含まれていないこと
- 長さが6文字以上、12文字以下であること
を一度に判断しています。
問題12
それでは、次回の宿題です。
問題12:
2つの引数の最大公約数を返す関数 gcd(Greatest Common Divisor)を作り、それを使ってキーボードから入力した2数の最大公約数を表示します。
⇒解答と解説は次回
Copyright © ITmedia, Inc. All Rights Reserved.