c言語を学び始めたばかりの者です。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
main(){
printf("数当てゲームを開始します。\n");
int a,count,n,b;
srand((unsigned)time(NULL));
printf("1~10の中から1つ数字を選びます。\n");
a = (rand()%10)+1;
printf("選びました\n");
for(count=0;;count++){
printf("その数字はズバリ:");
scanf("%d",&n);
//もし数字でなければという文にしたい!!
if (?){
printf("数字を入力してください。\n");
continue;
}
else{
if(n<a){
printf("もっと大きな値です。\n");
printf("%d回間違えました。\n",count+1);
continue;
}
if(n==a){
printf("正解です!!\n");
b=0;
exit(0);
}
if(n>a){
printf("もっと小さな値です。\n");
printf("%d回間違えました。\n",count+1);
continue;
}
}
}
}
というプログラムなのですが数字の判定の仕方が分からなくて最初のifの条件に何をいれればいいのか分からないので分かるかたいましたら教えてもらえないでしょうか?
No.1ベストアンサー
- 回答日時:
scanf("%d",&n);を使っている時点で、数字以外は引数に取れないです。
というか、数字以外を入れた場合、正常に動作しない可能性があります。
数字以外が来ても異常動作しないようにするには、
プログラムの最初の方で、char buf[256];のように宣言し、
fgets(buf, sizeof(buf), stdin);とやって文字列として数字を取得します。
数字かどうかはisdigit(buf[0])すると判定できます。
真面目にやるにはbuf_lenとiも宣言して、こんな感じのプログラムを書きます。
buf[strlen(buf)] = '\0';
buf_len = strlen(buf);
for (i = 0, nodigit = 0; i < buf_len; i++) {
if (!isdigit(buf[i])) {
nodigit = 1;
break;
}
}
if (nodigit) {...数字ではない }
面倒なので、頭だけ数字だったら後は適当でいいかなと思ったりはしますが。
数字の文字列が入っている場合、n = atoi(buf);すると、bufを数字に変換し、nに代入します。
この回答への補足
勉強不足で申し訳ないのですが
if (!isdigit(buf[i]))
ってどういう意味なのでしょうか?
nodigit
ってなんなのでしょうか?
No.3
- 回答日時:
基本は #1 の人が言うように fgets() を利用して入力をうけとります。
あとは、取得されたバッファをチェックして、数字に変換ですかね。
チェックの方法はいろいろと好みがありますけど
この場合は数値変換できればよいので strtol() を使うのが楽かなと思います。
# **endptr == '\0' なら数値のみ
Linux用のページですけどPOSIX関数はどのOSでも同じでしょうから
個々の関数の使い方や違いは調べてみてください。
おすすめは
- strtol
- strspn
- sscanf
あたりですかね~
参考URL:http://www.linux.or.jp/JM/
No.2
- 回答日時:
>勉強不足で申し訳ないのですが
>if (!isdigit(buf[i]))
>ってどういう意味なのでしょうか?
回答をしっかり読んでますか?
No.1氏の回答に
>数字かどうかはisdigit(buf[0])すると判定できます。
とあります。
isdigit()は「数字」(数値ではなく、'0'~'9'の文字)かどうかを判断する関数です。
つまり、buf[]に格納された内容が全て数字かどうかを判断しています。
>nodigit
>ってなんなのでしょうか?
「No Digit」つまり「数字ではない」という意味でしょう。
本来なら、その先にnodigitをフラグとして数字以外が入力された場合の処理があるはずです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
printfの出力内の文字をdefine...
-
C言語
-
分数を表示するプログラム(長...
-
答えを教えてください
-
【C】fizzbuzzのトリッキーなコ...
-
2進数の加算の繰り上がり
-
C言語での、年複利の計算方法...
-
C言語で、「自然数nを入力し、n...
-
5×5の転置行列を求めるC言語の...
-
ガウスの消去法、後退代入について
-
CTRL+Dでループを抜けるには
-
srand(time(NULL))の使い方
-
switch分のケースを範囲数?に...
-
error C2143: 構文エラー : ';'...
-
printf("%lf",5/3); は 0.00000...
-
C言語での数字の花形表示
-
空Enterの扱い方
-
三平方の定理を求めるプログラム
-
コマンドプロンプトがすぐ消える
-
printf で二進表示を行いたい。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
【C言語教えてください】sin波...
-
printf で二進表示を行いたい。
-
c言語でAからZまでを表示する...
-
コマンドラインに出力した文字...
-
strcmp
-
4の倍数を論理演算で表す。。
-
scanfに文字が入力されたときに...
-
C言語での、年複利の計算方法...
-
C言語 プログラミング
-
hit&bolwのプログラミングがで...
-
%P と %X の違い
-
unsigned int型について
-
printf( " %2d", p * q );
-
cshの文字列操作(0埋め)
-
改行について 1行に何個かづ...
-
8人分のテストの点数を入力し、...
-
入力したお金の金額からお札の...
-
三角形の判別
-
テキストカーソル位置の取得
おすすめ情報