opamp_sando's blog

クソザコが割りと適当なことを書くためにある備忘録です。あとたまに普通の日記も書きます

isdigit関数で数値判定

と、いうことでisdigitを使った数値判定の例が意外とないので書いてみる。本日4度目の更新なわけだが書くことができたらすぐ書きたくなる主義なのでしょうがない。
ということで、isdigitの復習。 isdigitはint型で入力された文字が数値ならば1を返すような関数。
しかしこのisdigitは"文字"は正しく判定できるが"文字列"はそのままでは判定できない。そこで文字列を1文字ずつに区切って読み出すことで文字列が数値であるかを判定する。
また、そのままでは 01 などというようなありえない数値をうっても数値であると認識されてしまうため最初の桁が0でそれ以降が\0でなかった場合は数値ではないという判定をするような関数isNumberを作る。

まずは関数に文字列を1文字に分解する部分をかく必要がある

int isNumber(char* str){ //引数strが判定対象の文字列
char ch;
int rp = 0;

do{
ch = *(str + rp);
rp += 1;
}while(*(str + rp) != '\0');

}//ここで関数終わり

これで、一文字ずつ取り出すループが完成した。do文によってループさせ、渡された文字列を順番にchに代入し\0にたどり着いた時点でループを抜けるようなプログラムである。

あとはここに、isdigitを使った数字判定を設ければ数字の羅列か文字が含まれているかを判定するだけの関数ができる。

int isNumber(char* str){
char ch;
int rp = 0;

do{
ch = *(str + rp);
rp += 1;
if(isdigit(ch) != 1){
return 0;
}
}while(*(str+rp) != '\0');

return 1;
}//関数終了

これで、文字列がすべて数字で構成されていれば1が返るような関数ができた。ただし現状では 001 などという数値を打ったとしてもエラーにならない。

少し複雑になるがさらに以下のように「rp = 0 かつ ch = '0'のときstrの次の文字*(str + 1)が指すところが\0でなければそれは文字列(return 0)である」という処理を追加する。
はてなのインデントは自動で詰められてしまいコードが見難くなるのでスクリーンショットを貼る。(どうやったら詰められないようになるのかわかってない・・・)

と、画像になってしまったが、このようにするとちゃんと判定できる。ifがネストするのを嫌う人もいるが自分は別によほど多くない限り2・3段のネストはしょうがないと思っている。(自分自身あんまり効率的にはかけないので)

ということでこれでできるとおもう。 上の関数だと、数値ならば1が返り、それ以外なら(01なども含む)ば0が返る。

Firefox ブラウザ無料ダウンロード