C言語で、Hit and Blow(3ケタの数字) を作りました。
数字以外が入力されたときにもう一度入力させるプログラムが分かりません。
例:ae42やrtg3などが入力された場合
どのように下のプログラムを改良すればよいか教えてください。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int num1, num2, num3;
int user, user1, user2, user3;
int hit, blow, count;
srand(time(0));
num1=rand()%10;
while (1) {
num2=rand()%10;
if (num2!=num1) {
break;
}
}
while (1) {
num3=rand()%10;
if (num3!=num1 && num3!=num2) {
break;
}
}
printf("%d%d%d\n",num3,num2,num1);
count=1;
printf("重複しない3つの数字:");
while(1) {
while (1) {
scanf("%d",&user);
user3=user/100;
user2=(user/10)%10;
user1=user%10;
if (user1!=user2 && user1!=user3 && user2!=user3) {
break;
}
printf("重複してます!重複しない3つの数字:");
}
if (user1==num1 && user2==num2 && user3==num3) {
break;
}
hit=0;
blow=0;
if (user1==num1) {
hit++;
}
if (user2==num2) {
hit++;
}
if (user3==num3) {
hit++;
}
if (user1==num2 || user1==num3) {
blow++;
}
if (user2==num1 || user2==num3) {
blow++;
}
if (user3==num1 || user3==num2) {
blow++;
}
printf("%dヒット%dブロー\n",hit,blow);
printf("次の数値:");
count++;
}
printf("%d回で当たりました!\n",count);
return 0;
}
No.5ベストアンサー
- 回答日時:
No.2です。
> どこにNo.2を加えればよいのでしょうか。
No.2のプログラムは、数字を入力して変数userに代入するものです。
ですから同じ動作をしている部分、すなわちscanf()と置き換えれば良いのです。
以下は、No.2のプログラムを修正して関数化したものです。
#include <ctype.h>と 関数input(){ }をmainの上に追加して、
scanf()を代入文に置き換えてみてください。
----------
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
// 関数
int input(void){
char buf[4];
int i;
while(1){
printf("重複しない3つの数字:");
// fflush(stdout);
for(i = 0; i < sizeof(buf); i++) buf[i] = 0;
fgets(buf, sizeof(buf), stdin);
if( buf[sizeof(buf)-2] != '\n' && buf[sizeof(buf)-2] != 0)
while( getchar() != '\n') ; // 入力バッファクリア(この行、要セミコロン)
if( !isdigit(buf[0]) ) continue; // 1文字目が数字かチェック
if( !isdigit(buf[1]) ) continue; // 2文字目が数字かチェック
if( !isdigit(buf[2]) ) continue; // 3文字目が数字かチェック
break;
}
return atoi(buf);
}
// メイン
int main(void){
int user;
user = input(); // scanfの代わり
printf("number : %d", user);
return 0;
}
----------
No.4
- 回答日時:
その「いろいろと試した」の具体例を書いてもらえませんか?
まあ, 最悪 getchar を使えばなんとでもなるんだけど.
なお fflush(stdin); は
https://oshiete.goo.ne.jp/qa/9287686.html
の回答では「実装依存」となっていますが, 正しくは「未定義動作」です. 規格に明確に「未定義」と書いてあるので「実装依存」と解釈してはならず (実装に依存するなら「処理系定義」とするのがふつう), 純粋に「未定義」であると解釈しなければなりません. 資料によってはこれで「入力バッファがフラッシュできる」となっていることもありますが, それは古代の資料としてみるべきです. もちろん規格上未定義動作である以上, 処理系が動作を定義することはまったく問題ありませんが, この質問では処理系が明記されていない以上未定義動作であるようなものを「回答」に加えるべきではないでしょう (「環境によっては」と書いてあるのでまだ良心的ではあるといえますが).
No.3
- 回答日時:
「実際に動かしてみたのですが、プログラムが動きません。
」ではなく, 具体的に「どう」動かないのかを書くべきだねぇ. あと, 細かいんだけど016hogehoge
は OK? NG? 数字の前に空白はあっていいのかな?
ちなみに fflush(stdin); は一般にはやっていけない操作なので要注意.
No.2
- 回答日時:
こんな感じでどうですか?
一度配列に3文字を読み込み、それが全て数字だったら数値化する。
数字でなかったら、再度入力を促す。
※2か所のfflush()は環境によって、必要かもしれません。
--------
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define BUF_SIZE 3 // 3文字
int main(void){
char buf[BUF_SIZE + 1];
int user;
while(1){
// fflush(stdin);
printf("重複しない3つの数字:");
// fflush(stdout);
fgets(buf, BUF_SIZE + 1, stdin); // 配列bufに読み込む
if(!isdigit(buf[0])) continue; // 1文字目が数字かチェック
if(!isdigit(buf[1])) continue; // 2文字目が数字かチェック
if(!isdigit(buf[2])) continue; // 3文字目が数字かチェック
break;
}
user = atoi(buf); // 数値化する
printf("number : %d", user);
return 0;
}
No.1
- 回答日時:
本題とは関係ないような気もするんだけど, 例えば
032
は「3ケタの数字」と言っていいのかな? 同じように, 「重複しない3つの数字」と言っているときに
16
と入力するのは OK なのかな?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- JavaScript JAVASCRIPT 2 2022/04/15 15:10
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C++ と、 1 2022/11/07 23:45
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
数字以外が入力されたらエラー文を出したい。
C言語・C++・C#
-
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
関数から配列を返すには?
C言語・C++・C#
-
-
4
if文の条件にscanf関数を使うと…?
C言語・C++・C#
-
5
入力値が1以下、かつ数字以外の文字の場合・・・
C言語・C++・C#
-
6
char str[256]の256の意味は?
C言語・C++・C#
-
7
入力する数字のサイズ制限について
C言語・C++・C#
-
8
C言語のポインターに関する警告
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
for文の中にswitch文はいれられ...
-
C言語 数字以外を入力させない...
-
c言語for文
-
#if 1 #elseの意味について
-
c言語で平均をだす
-
n個からm個を取り出すプログ...
-
行列をべき乗させるプログラム
-
scanf関数を用いての加減乗除%...
-
C言語で電卓を作成する。
-
c言語プログラミングで1から100...
-
配列を使って魔方陣
-
C言語 偶数判定
-
配列を関数に渡す方法
-
初心者です。for文、if文を使っ...
-
C言語 重複しない4ケタの乱数...
-
C言語プログラムが理解できなくて…
-
C言語の二分法のプログラムにつ...
-
C言語階乗の総和を求める
-
scanfが実行されません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
C言語階乗の総和を求める
-
配列を使って魔方陣
-
C言語 数字以外を入力させない...
-
C言語プログラムが理解できなくて…
-
配列を関数に渡す方法
-
初心者です。for文、if文を使っ...
-
scanf関数を用いての加減乗除%...
-
c言語プログラミングで1から100...
-
getcの改行判定
-
while文について、c言語...
-
プログラミングで二番目に大き...
-
VHDLで、case文とwhen文のどち...
-
C言語で電卓を作成する。
-
C言語の二分法のプログラムにつ...
-
階乗のプログラム!!
-
プログラミングに関して
-
C言語についてですfor ifをつか...
おすすめ情報
032は、3ケタの数字に含み、16では再入力させるようにしたいです。
実際に動かしてみたのですが、プログラムが動きません。
どのように改良したらよろしいのでしょうか?
No.2を私の書いたプログラムのどこに入れればよいかがわかりません。
色々と試したのですが、入力した数字やアルファベットにより、無限ループになります。
~~~~~
scanf("%d",&user);
if (user1!=user2 && user1!=user3 && user2!=user3) {
break;
}
fgets(buf, BUF_SIZE + 1, stdin);
if(!isdigit(buf[0])) continue;
if(!isdigit(buf[1])) continue;
if(!isdigit(buf[2])) continue;
break;
user = atoi(buf);
printf("重複してます!重複しない3つの数字:");
~~~~~
字数の関係ですべて打つことができなかったのですが、この箇所にNo.2を入れたのですが、
アルファベットを加えると無限ループします。
どこにNo.2を加えればよいのでしょうか。