RGKT-NDS-STDY-007(007)
enum 大活用。
使いどころを覚えると手放せない利便性をもってますな。>列挙型
関数仕様を変えた。
bool inputf(const char *format, u8 digit, void *value) { /// }
入力桁数は指定するように変更。
つーのも sscanf() とか利用して書式を知るにしても
"%2d" とかって指定された書式を、それを自前の入力方式の2桁として扱うなんて都合よく解釈させるには、
結局その文字列から '2' というキャラクタを抜き出さなくてはならなくて(現状の知識ではそれしか思い浮かばんかった。)
それだとそこだけ自前であり、
sscanf() という標準ライブラリを利用してバグの要因を減らすって目的を果たすことにならんので。
尚且つバグが入り込む余地が生まれそうだ…と。
で初心に戻って見直し。
シンプルな処理にする手っ取り早い方法を考えてみると。
桁数を引数で受け取ることに帰結した。
そうすることで構文解析に無駄な処理書く必要もないし、
3種のモードを選択させるだけの構文解析なら別に sscanf() なんて使わずとも
第一引数で受け取った文字列ポインタと文字列リテラルとを3種それぞれ比較させれば済むってことに気付く。
こんな風に。
if((format == (char*)"%d") || (format == (char*)"%D")){ /* decimal input mode. */ return DECIMAL_MODE; }else if((format == (char*)"%x") || (format == (char*)"%X")){ /* hexa input mode. */ return HEXA_MODE; }else if((format == (char*)"%c") || (format == (char*)"%C") || (format == (char*)"%s") || (format == (char*)"%S")){ /* string input mode. */ return STRING_MODE; } /* mode unknown. */ return MODE_UNKNOWN;