

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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンパイルエラーについて
-
H8マイコンCでprintf/scanfが使...
-
「%n」や「%S」は何故恥ずかし...
-
C言語プログラミング
-
C言語の勉強しています。すみま...
-
C言語で四則演算を使って10を作...
-
ピラミッド表示プログラム。
-
ホームページをC言語で作りたい...
-
最早開始時間と最遅完了時刻を...
-
Aの値からBの値を除するとは??
-
信頼区間の1.96や1.65ってどこ...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
値差の%計算方法について
-
数字以外が入力されたらエラー...
-
「Aに対するBの割合」と「Aに対...
-
VB6.0での小数点の扱いについて
-
【C++】関数ポインタの使い方
-
c languageで 簡単な質問があ...
-
ある商品のロス率を5%見込み、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
コンパイルエラーについて
-
CTRL+Dでループを抜けるには
-
Cプログラムについて
-
コマンドラインに出力した文字...
-
WM_CLOSEで閉じれないウィンド...
-
C言語の&に関する質問
-
すごろくに使用するサイコロ
-
文字と数字の判定について
-
printf( " %2d", p * q );
-
【C言語教えてください】sin波...
-
%P と %X の違い
-
C言語の勉強しています。すみま...
-
strcmp
-
c言語でAからZまでを表示する...
-
unsigned int型について
-
(C言語)めちゃくちゃな値にな...
-
printf で二進表示を行いたい。
-
プログラミング C言語 課題でプ...
-
c言語で2000年以降カレンダーを...
おすすめ情報