連載
» 2014年10月17日 11時00分 公開

完全マスター! 組み込みC言語プログラミング(12):【問題11】文字列の長さと文字種類の判別 (4/4)

[横田一弘 埼玉県立新座総合技術高等学校 教諭,MONOist]
前のページへ 1|2|3|4       

問題11の解説

 それでは問題11の解答例「password.c」の解説をしましょう。問題11で定めるキーワードには、英小文字、英大文字、数字を含む約束になっています。このような問題を解決するテクニックにフラグ(Flag:旗)があります。

 ここでは、英小文字、英大文字、数字のフラグを用意して、もし英小文字を発見したら英小文字のフラグを立てます。同様に英大文字のフラグと数字のフラグを機能させて、最後に3つのフラグが立っていたらパスワードとしての条件は満たされることになります。

 各フラグは旗が立っているか寝ているかの2値ですから、ビットで割り当てることができます。password.cでは、変数flgの各ビットを、下図のように割り当てています。

photo

 さて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数の最大公約数を表示します。

⇒解答と解説は次回



前のページへ 1|2|3|4       

Copyright © ITmedia, Inc. All Rights Reserved.