質問: scanf()についてお伺いいたします。 当方c言語を勉強していますが初心者です。 分からないことが出たのでご教授いただけると幸いです。 scanfで数値を1以上、100以下で入力を制限したいのですが、その方法が調べても分かりませんでした。それともscanf()では制限はかけられないのでしょうか? scanf()で入力値の制限を設ける方法をご存知の方がいましたらご教授ください。 お手数ですが宜しくお願い致します。
回答: scanfを使うなら無いですね。 入力してから1~100か判定して違っていたら再入力をさせるぐらいです。 元から1~100以外の値を入れさせたくないのなら、新しい入力関数を自作して、getcharなど1文字入力を使って処理させないといけませんね。 大雑把な例では次のような感じでしょうか、私の手元ではdosなどで完全に動作するソフトを作れないので、もし警告やエラーがあったら自分で修正して下さい。 #include /* 3桁の数値入力 */ int input0to100() { int no[3]; no[2]=input0to9(1); /* 100の位 0~1 */ no[1]=input0to9(9); /* 10の位 0~9 */ no[0]=input0to9(9); /* 1の位 0~9 */ return(no[0]+no[1]*10+no[2]*100); } /* 1桁の数値入力 */ int input0to9(int max) { int ky; while(1){ ky=getchar(); /*1文字入力*/ if(ky>='0' && ky<='0'+max){ printf("%c", ky); return(ky-'0'); } } } ただし、これではまだ次の部分がまだ不完全です。 1.入力を中断する機能が必要 2.前後にもカーソルを移動させて入力値を訂正できる機能が必要 3.このままでは000や101~199の値も入力できるので,これを禁止させる機能 4.このままでは3桁の数値を入力するとすぐに値が決定されてしまうので、先の訂正と合わせて入力値を決定するキーが必要 その部分までちゃんと作ろうと思ったらキー入力のコードやカーソルなどの画面制御の方法(エスケープシーケンス)を分かっていないといけないのですけど、動作環境やosにより違いがありますし、ソースがもっと複雑になって理解しにくくなると思いますので。 一般的なdosなら次のリンク先の情報が参考になると思います。 後は自分で調べて仕上げて下さい。 キーボードの文字入力コードについて http://rarara.cafe.coocan.jp/cgi-bin/lng/vc/vclng.cgi?print+200011/00110003.txt エスケープシーケンスによる画面制御 http://www.mm2d.net/c/c-06.shtml http://www.grapecity.com/tools/support/powernews/column/clang/047/page02.htm