• ベストアンサー

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% (4856/10272)
回答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

  • scanfについて

    C言語について勉強してます。 入力した整数の下2桁と10の位とを表示するプログラムをscanfで作りたいのですが方法がよくわかりません。 前者については整数を100で割った剰余とすればよいのかと推測しています。後者については参考書を読んでも検討がつきません。 詳しい方、よろしくお願いします。

  • C++でscanfは使えない?

    お盆休みを利用してC言語の勉強をしようと思っています。 さわり程度にはわかるのですが、ポインタなどを本気で理解してみようと思っています。 PCにvisual studio2013が入っているので、2013のC++のプロジェクトを使って勉強していこうと思っているのですが、下記のように入力すると、scanfでエラーが出てしまいます。 #include "stdafx.h" #include <stdio.h> void main() { int n; scanf("%d",&n); } C++ではC言語の文法は全て使えると聞いていたのですが、ある程度例外もあるということなのでしょうか?それともなにか原因があるのでしょうか?

  • scanfについて

    C言語入門者です。基本的な問題で申し訳ないのですが 入力した文字がaの時だけ表示するプログラムを書きました。 scanf("%c", &d); if(d == "a"){ printf("inputed key is %c \n", d); } と書いたのですがコンパイルすると「ポインタと他の型が混在しています」とでてコンパイルが通りません。なでなんでしょうか?dに代入した文字や数値を変数として使う場合はどうしたらいいのでしょうか? どなたかご指導お願いします。m(_ _)m

  • scanf()関数の使い方について

    はじめまして。 質問があります。 まずは、以下のコードを見てください。 ---------------------------------------------------------------- #include<stdio.h> int main(void) { char c; int i; printf("0を入力すると終了します。\n"); while(1) { printf("文字を入力してください=>"); scanf("%c",&c); printf("入力した文字は %c です。\n",c); printf("数字を入力してください=>"); scanf("%d",&i); if(i==0) { break; } printf("入力した数字は %d です。\n",i); } return 0; } ---------------------------------------------------------------- 上のコードを実行すると、初回はscanf()はcharとintの両方とも 入力待ちになってくれるのですが、2回目以降はcharは入力待ちに なってくれません。これは、なぜなのでしょうか? ご教授お願いします。 現在VC++6.0を使用しております。

  • scanfの謎

    C言語の以下のプログラムがありまして、 #include <stdio.h> main() { int i; scanf("%d ", &i);printf("d=%d\n", i); } これを実行すると、 1 2 d=1 のように、入力を2回受け付けてしまいます。 一体なんでこのようなことが起こるのでしょうか?教えてください。

  • scanf関数について

    質問があります。 最近C言語を勉強し始めたのですが、scanf関数を使うと以下のような警告が出ます。 「arning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(306) : 'scanf' の宣言を確認してください。」 使用しているのは Visual C++ 2008 Express Editionです。

  • C言語を勉強中の初心者です。

    C言語を勉強中の初心者です。 身長と体重をscanfで入力、表示するまではできるのですが、その入力件数を出したいのですが いろいろネットで探してもよくわかりませんでご教授ください。

  • scanf関数を用いての加減乗除%+-*/入力 

    忙しい中失礼します。 C言語超初心者のものです。加減乗除入力方法について質問があります。 現在、scanf関数を用いて直接の加減乗除%+-*/を入力することにより、9-2=7なり、9*2=18なり、9/2=4なりの回答を出してみたいと思っているのですが、例2の文に変更した後、コンパイルしようとするとエラー(parse error before '2' )が出ます。 どのようにすれば、このエラーはなくなりますか?また、エラーがなくなれば、直接の加減乗除は可能でしょうか? 現在習っているC言語レベル: int、 scanf、 if-else 位です。 プログラム 例1 int main() { int num1, num2; char chr; printf("Enter an operator (* / + - %%): "); scanf("%c",&chr); scanf("%c",&num2); num1 = 9 - 2; printf("%d - %d = %d\n", 9, 2, num1); system("pause"); return 0; }  9-2=7    例2: num1 = 9 'chr’ 2; printf("%d %c %d = %d\n", 9, 'chr', 2, num1); scanfを用いてのキーボードからの”数値”の入力についての回答は沢山見つかるのですが、加減乗除入力についての回答はありませんでした。http://oshiete1.goo.ne.jp/qa1917724.htmlから多分”直接”の加減乗除入力なんてないのだろうな・・・と思いつつもどのページも’ハッキリ’とは書いていないので、質問しました。 そもそもscanf関数では直接の加減乗除入力を受け付けていない?ものなのでしょうか?もしあるのでしたら、その方法も教えて下さい。 どなたか分かる方がいらっしゃいましたら、回答願います。自分の知識の中では曖昧なのでハッキリした回答が欲しいのです。

  • scanf関数を用いての標準演算子(*/+-%)の入力方法

    C言語超初心者のものです。 scanf関数を用いての標準演算子(*/+-%)の入力方法について質問があります。 例:17 / 5 = 3 において ”17”、 ”/”、 ”5” を各々キーボードから入力し、”3”の数値をDOS画面?上に表示させるものです。 ”17”、”5”はscanf関数を使いキーボードから入力できるのですが、”/”だけがどうしても標準演算子として認識させることが出来ません。 私は以下のプログラムを組んでいるのですが、 char num3;  ・・・(省略) printf("Please type in a operator: "); scanf("%c",&num3);  ・・・(省略) printf("%d %c %d is %d\n", num1, num3, num2, product); 無理やりコンパイルして、DOS画面?上に表示させても17 / 5=65536となってしまいます。 ”/”をプログラミングの中で認識させて、ディスプレイ上で例式が正常に表示されるようにしたいのですが、どうしても回答が3になりません。 多分1つの標準演算子が入力できれば、他の標準演算子も入力できると考えています。 どうすればキーボードから標準演算子をプログラミングに認識させることが可能になるのでしょうか? どなたか分かる方がいらっしゃいましたら教えて下さい。 また参考になるURLなどがあればそれも教えて下さい。 よろしくお願いします。

  • scanfでの可変引数

    こんばんわ。 C言語で簡単な支出計算プログラムみたいなのを作ったのですが、自分の思ったようなプログラムが書けません。 #include<stdio.h> int main(int argc,char *argv[]){ int i; int n1; int a1,a2; int sum=0; puts("計算する日数を入力してください。"); printf("日数:"); scanf("%d",&n1); for(i=1;i<=n1;i++){ printf("%d日目:",i); scanf("%d",&a1); sum+=a1; } printf("【%d日間の支出】:%d円\n",i-1,sum); } 実行結果は以下のようになります。 計算する日数を入力してください。 日数:2 1日目:100 2日目:200 【2日間の支出】:300円 このプログラムだと1日に1つの支出しか計算してくれません。 1日で入力できる支出を複数にしたいのですが、つまり下のように 計算する日数を入力してください。 日数:3 1日目:100,150 2日目:200 3日目:300,150,1000 【3日間の支出】:1900円 のようにscanfで入力した数値を可変個の値にしたいのですが、 どのように実現したらよいでしょうか? scanf("%d,%d"&a1,&a2);のように2つにしてれやば複数にはできますが 必ず2個入力しないとエラーになってしまいます。 調べた所va_listという可変引数リストが使えそうなのですが、 scanfでどのように使えばよいのかわかりません。 ご教授よろしくお願いします。