• ベストアンサー

scanf()についてお伺いいたします。

当方C言語を勉強していますが初心者です。 分からないことが出たのでご教授いただけると幸いです。 scanfで数値を1以上、100以下で入力を制限したいのですが、その方法が調べても分かりませんでした。それともscanf()では制限はかけられないのでしょうか? scanf()で入力値の制限を設ける方法をご存知の方がいましたらご教授ください。 お手数ですが宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • yama1718
  • ベストアンサー率41% (670/1618)
回答No.3

scanfを使うなら無いですね。 入力してから1~100か判定して違っていたら再入力をさせるぐらいです。 元から1~100以外の値を入れさせたくないのなら、新しい入力関数を自作して、getcharなど1文字入力を使って処理させないといけませんね。 大雑把な例では次のような感じでしょうか、私の手元ではDOSなどで完全に動作するソフトを作れないので、もし警告やエラーがあったら自分で修正して下さい。 #include <stdio.h> /* 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

dainithi
質問者

お礼

とても分かりやすいご説明ありがとうございました! 記述例の問題点まで記入して頂き感謝します。ぜひ参考にさせて頂きます。

その他の回答 (3)

  • notnot
  • ベストアンサー率47% (4900/10359)
回答No.4

scanfだけでは出来ないのは他の方の回答通り。 また、scanfは機能を熟知した人じゃ無いと使わない方がいいです。はまります。 int n; char buf[1000]; do { if(!fgets(buf,sizeof buf,stdin)){ fprintf(stderr,"入力エラー\n"); exit(1); } n = atoi(buf); } while( n<1 || n>100 ); みたいな感じで。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

ですから、scanfだけでは無理かと。 一つの命令でできないことを、沢山の命令を組み合わせて実現するのがプログラムです。 1. scanfで入力 2. 入力が正しければ次へ、正しくなければ1へ戻る とかいうようなプログラムを作ってください。 ※ 本格的にscanfのエラー処理やろうとすると、結構面倒ですが。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

(この場合 scanf だけでは) 無理.

dainithi
質問者

補足

それは理解できます。 もし宜しければ記述例を出していただけると幸いです。 宜しくお願い致します。

関連するQ&A

専門家に質問してみよう