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

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

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

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

Q&A

解決済

3回答

8963閲覧

[C言語] 整数以外の値を入力させない方法について

besic

総合スコア14

C

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

0グッド

0クリップ

投稿2018/11/17 12:13

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4 5int num(void) 6{ 7 int a, b, c, d, e, i; 8 srand(time(NULL)); 9 printf("九九計算\n"); 10 printf("plese push any key\n"); 11 system("pause"); 12 e = 0; 13 for (i = 1; i <= 10; i++) 14 { 15 //乱数の生成 16 a = rand() % 9 + 1; 17 b = rand() % 9 + 1; 18 //回答の生成 19 d = a*b; 20 printf("%d×%dは? :", a, b); 21 scanf("%d", &c); 22 23 //正解か判断 24 if (c == d) { 25 printf("正解です!\n"); 26 e++; 27 } 28 else { 29 printf("残念ながら不正解です。\n"); 30 printf("答えは%dです。\n", d); 31 } 32 printf("%d回目終了!あと%d回!頑張ろう。\n", i, 10 - i); 33 } 34 return e; 35} 36 37void main() 38{ 39 int e = num(); 40 printf("全問終了!\n"); 41 printf("結果は...%d問正解です!\n", e); 42 if (e == 10) { 43 printf("全問正解おめでとう!\n"); 44 } 45 else if (e == 0) { 46 printf("全問不正解...次は頑張ろう!\n"); 47 } 48 else if (e <= 5) { 49 printf("もっとできるよ!頑張ろう!\n"); 50 } 51 else if (e < 10) { 52 printf("あと少しで全問正解!頑張ろう!\n"); 53 } 54 system("pause"); 55}

このような九九の計算のゲームをCで作成しているのですが、
整数以外の入力があったときに、エラーになってしまいます。
”エラーです。”などと表示させて、
もう一度入力させるにはどうすればよいでしょうか。

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

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

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

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

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

guest

回答3

0

ベストアンサー

fgets と strtol をつかってみました。
また、いろいろ細かな変更もしています。

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <limits.h> /* INT_MAX, INT_MAX */ 4#include <time.h> 5 6int num(int num_question) { 7 srand(time(NULL)); 8 printf("九九計算\n"); 9 10 int score = 0; 11 for (int i = 1; i <= num_question; i++) { 12 // 乱数の生成 13 int a = rand() % 9 + 1; 14 int b = rand() % 9 + 1; 15 // 回答の生成 16 int c = a * b; 17 18 printf("%d×%dは? :", a, b); 19 int ans = 0; 20 while(1) { 21 char line[10]; 22 char * endp; 23 long v; 24 fgets(line, sizeof(line), stdin); 25 v = strtol(line, &endp, 10); 26 if (line == endp) { 27 puts("数値に変換できませんでした"); 28 } 29 if (v > INT_MAX || v < INT_MIN) { 30 puts("int型には変換できません"); 31 } else { 32 ans = (int)v; 33 break; 34 } 35 } 36 37 // 正解か判断 38 if (c == ans) { 39 printf("正解です!\n"); 40 score++; 41 } else { 42 printf("残念ながら不正解です。\n"); 43 printf("答えは%dです。\n", c); 44 } 45 printf("%d回目終了!あと%d回!頑張ろう。\n", i, num_question - i); 46 } 47 return score; 48} 49 50int main() { 51 int num_question = 10; 52 int score = num(num_question); 53 printf("全問終了!\n"); 54 printf("結果は...%d問正解です!\n", score); 55 if (score == num_question) { 56 printf("全問正解おめでとう!\n"); 57 } else if (score == 0) { 58 printf("全問不正解...次は頑張ろう!\n"); 59 } else if (score <= num_question / 2) { 60 printf("もっとできるよ!頑張ろう!\n"); 61 } else { 62 printf("あと少しで全問正解!頑張ろう!\n"); 63 } 64 return 0; 65}

参考情報

  • gets( )とscanf( )の問題点の解決

http://www1.cts.ne.jp/~clab/hsample/IO/IO16.html

  • 1行の文字列として入力する

https://9cguide.appspot.com/22-01.html

  • 文字列トークンを整数に変換するには strtol() 系の関数を使う

https://www.jpcert.or.jp/sc-rules/c-int06-c.html

...
sscanf関数による数値変換では、値が表現可能な値の範囲外となるケースの検知が行えない点に注意が必要です。整数オーバーフロー/アンダーフローが発生した場合の動作は処理系依存となります。
...

投稿2018/11/17 14:16

編集2018/11/17 14:18
katoy

総合スコア22324

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

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

besic

2018/11/17 14:45

コード例、参考アドレスまで説明いただき、ありがとうございます。 上から1番目のリンクはとても分かりやすいです。 ありがとうございます!
guest

0

scanfの使用は避けた方が良いですね。fgets+sscanfを使う方が簡単です。

C

1int c; 2char line[100]; 3 4while(1){ 5 fgets(line, sizeof line, stdin); 6 if(sscanf(line,"%d",&c)==1){ 7 break; 8 } 9 printf("数字を入力して下さい\n"); 10}

投稿2018/11/17 12:50

otn

総合スコア84498

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

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

besic

2018/11/17 13:51

ありがとうございます。 コピペで今回はできましたが、 しっかり学びたいと思います。
guest

0

簡単な実装ならscanf()の戻り値を調べる方法が有ります。・・・この場合は12abとか入力されると読めちゃいます。あとは、fgets()で読み込んで数字かどうか判定するですかね?

投稿2018/11/17 12:19

cateye

総合スコア6851

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

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

besic

2018/11/17 12:22

cateyeさん、たびたびありがとうございます! 今、調べてみます。
besic

2018/11/17 13:54

たびたび回答していただいたのにベストアンサーに することができなくてすみませんm(__)m fgetsについてはよくわからないので勉強させていただきます。 また回答よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問