質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

2631閲覧

正しく動きません。。。

uekakimoto2

総合スコア7

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/02/02 23:20

#include <stdio.h>

int main(void)
{
int a=0,b=0;

printf("入力をしてください\n"); while (1) { scanf("a=%d b=%d",&a,&b); if (a != 0 && b != 0) { printf("OKです\n%d %d\n",a,b); break; }else{ printf("NG\n"); } } return 0;

}

間違った入力を失敗すると NG を出力してもう一度入力からやり直すというプログラムを作りたいのですが上記のプログラムを実行して間違った入力をすると無限に NG が出力され続けます。

どうしたら正常に動きますか、ご教授お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

fflushで入力バッファをクリアする回答があり自分もその方法で良いかと思ったのですが、調べてみるとfflushによる標準入力のクリアは未定義になるようです。
http://www.kijineko.co.jp/tech/superstitions/fflush-with-input-stream.html

なので代替策として、NGの場合は標準入力の空読みをさせてみました。
こちらでどうでしょうか。

c

1int main(void) 2{ 3 int a=0,b=0; 4 5 printf("入力をしてください\n"); 6 while (1) { 7 8 scanf("a=%d b=%d",&a,&b); 9 if (a != 0 && b != 0) { 10 printf("OKです\n%d %d\n",a,b); 11 break; 12 }else{ 13 printf("NG\n"); 14 } 15 while(fgetc(stdin) != '\n'); 16 } 17 return 0; 18} 19

投稿2017/02/03 00:12

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hikochang

2017/02/03 00:20

となると動かない環境も有るのですね、、、そもそもscanfの動き自体が未定義みたいなものなので使用を控えるべきですね、、、 scanf使うことありませんが参考になります!
ttyp03

2017/02/03 00:22

私もscanfを使うことはまずありませんが、こういう質問は知らなかった発見がありますね。
mugicya

2017/02/03 00:55

まじですか
guest

0

scanfがエラー入力した場合は入力バッファをクリアしましょう。

C

1#include<stdio.h> 2 3int main(void) 4{ 5 int a=0,b=0; 6 printf("入力をしてください\n"); 7 while (1) { 8 scanf("a=%d b=%d",&a,&b); 9 if (a != 0 && b != 0) { 10 printf("OKです\n%d %d\n",a,b); 11 break; 12 }else{ 13 fflush(stdin); 14 printf("NG\n"); 15 } 16 } 17 return 0; 18}

投稿2017/02/02 23:54

hikochang

総合スコア648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hikochang

2017/02/02 23:58

scanfは20年近く使ってませんでしたが、こんな問題がある事は知りませんでした。質問のコードを見ると一見動きそうですから、つい調べてしまいました。 https://ja.m.wikipedia.org/wiki/Scanf
guest

0

scanf のバッファをクリアしましょう。

fflush(stdin);

投稿2017/02/02 23:45

編集2017/02/02 23:49
mugicya

総合スコア1046

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

回答がすでに出ていますが、一般的なアドバイスとしては、端末からの書式指定入力の場合、
・scanfはすべてを知り尽くした上級者で無い限り使わない
・そうでない人は fgets + sscanf を使う(VCならsscanf_sとか)
・sscanf(scanf系その他も)は、必ず返り値(読み取れたデータ数)をチェックする
です。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int a,b; 6 int n; 7 char line[200]; 8 9 printf("入力をしてください\n"); 10 while(fgets(line, sizeof line, stdin)) { 11 n=sscanf(line,"a=%d b=%d",&a,&b); 12 if(n==2){ 13 printf("OKです\n%d %d\n",a,b); 14 break; 15 }else{ 16 printf("NG\n"); 17 } 18 } 19 return 0; 20}

投稿2017/02/03 00:49

編集2017/02/03 02:43
otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問