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

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

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

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

Q&A

4回答

14117閲覧

数字のみを受け付けたい

yowappu

総合スコア13

C

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

0グッド

0クリップ

投稿2016/08/29 05:43

編集2022/01/12 10:55

###前提・実現したいこと
数字のみを読み込ませる処理を行いたい

###発生している問題・エラーメッセージ
ループの一回目は文字をはじくのですが、1度でも数字が通ると、
その後は文字も通してしまいます。
ステータス入力関数の下です。
###該当のソースコード

C

1#include <stdio.h> 2#include <string.h> 3 4//ステータス構造体 5typedef struct{ 6 char name[256]; 7 int HP; 8 int AP; 9 int DP; 10 int EP; 11 } player; 12 13//プロトタイプ宣言 14void InputStatus(player *data); 15void ViewStatus(player data); 16 17//メイン関数 18int main() 19{ 20 player data; 21 InputStatus(&data); 22 ViewStatus(data); 23 24 return 0; 25} 26 27//ステータス入力関数 28void InputStatus(player *data) 29{ 30 31 printf("名前を入力して下さい\n<"); 32 scanf("%s",data->name); 33 while(1){ 34 do{ 35 printf("パラメータ:300を HP、AP、DP、EP(回避)にそれぞれ振り分けて下さい。\n"); 36 printf("※EPの上限は40です。\n"); 37 printf("HP = "); 38 scanf("%d",&data->HP); 39 rewind(stdin); 40 }while(data->HP < 0 || data->HP > 300); 41 do{ 42 printf("AP = "); 43 scanf("%d",&data->AP); 44 rewind(stdin); 45 }while(data->AP < 0 || data->AP > 300); 46 do{ 47 printf("DP = "); 48 scanf("%d",&data->DP); 49 rewind(stdin); 50 }while(data->DP < 0 || data->DP > 300); 51 do{ 52 printf("EP = "); 53 scanf("%d",&data->EP); 54 rewind(stdin); 55 }while(data->EP < 0 || data->EP > 40); 56 printf("\n"); 57 if(data->HP + data->AP + data->DP + data->EP > 300){ 58 printf("パラメータ合計が300を超えています。もう一度入力して下さい。\n\n"); 59 continue; 60 } 61 if(data->HP + data->AP + data->DP + data->EP < 300){ 62 printf("パラメータ合計が300に達していません。もう一度入力して下さい。\n\n"); 63 continue; 64 } 65 else if(data->HP + data->AP + data->DP + data->EP == 300){ 66 break; 67 } 68 } 69} 70 71 72//ステータス表示関数 73void ViewStatus(player data) 74{ 75 printf("名前:%s\n",data.name); 76 printf(" HP :%d\n",data.HP); 77 printf(" AP :%d\n",data.AP); 78 printf(" DP :%d\n",data.DP); 79 printf(" EP :%d\n",data.EP); 80 printf("\n"); 81}

###試したこと
gets、isdigit等調べてみたのですが、自分の力ではなんとも使うことが出来ずにいます。
どうすれば解決するか教えていただけないでしょうか、お願いします。

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

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

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

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

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

otn

2016/08/29 07:09

プログラムは、インデントをつけて、```C と ```の行の間に書いてください。
guest

回答4

0

こんにちは。

scanf()関数の戻り値は、読み込めた項目数です。
今回の場合、1つのscanf()で1項目だけ読み込んでますので戻り値が0だった場合、読み込めなかった(%dに対して数値でないものが入力された)ことになります。
ですので、scanf()の戻り値が0の時もループすればよいです。

投稿2016/08/29 06:19

Chironian

総合スコア23272

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

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

0

string型で入力、そのあと入力値が正しいかどうか外部関数で判断、正しい入力値の場合stoiでint型に変換してみました。

//bool areDigit() 入力値が整数のみかどうか判断 #include <stdio.h> #include <string.h> #include<iostream> using namespace std; bool areDigits(string str){ int len=str.length(); if(str[0]=='0')return false; for(int i=0;i<len;++i){ if(str[i]>='0'&&str[i]<='9'){ continue; }else{ return false; } } return true; } //ステータス構造体 typedef struct{ char name[256]; int HP; int AP; int DP; int EP; } player; //プロトタイプ宣言 void InputStatus(player *data); void ViewStatus(player data); //メイン関数 int main() { player data; InputStatus(&data); ViewStatus(data); return 0; } //ステータス入力関数 void InputStatus(player *data) { printf("名前を入力して下さい\n<"); scanf("%s",data->name); while(1){ do{ printf("パラメータ:300を HP、AP、DP、EP(回避)にそれぞれ振り分けて下さい。\n"); printf("※EPの上限は40です。\n"); printf("HP = "); string str; cin>>str; if(!areDigits(str))cerr<<"Invalid input: HP"<<endl; data->HP=stoi(str); rewind(stdin); }while(data->HP < 0 || data->HP > 300); do{ printf("AP = "); string str; cin>>str; if(!areDigits(str))cerr<<"Invalid input: AP"<<endl; data->AP=stoi(str); rewind(stdin); }while(data->AP < 0 || data->AP > 300); do{ printf("DP = "); string str; cin>>str; if(!areDigits(str))cerr<<"Invalid input: DP"<<endl; data->DP=stoi(str); rewind(stdin); }while(data->DP < 0 || data->DP > 300); do{ printf("EP = "); string str; cin>>str; if(!areDigits(str))cerr<<"Invalid input: EP"<<endl; data->EP=stoi(str); rewind(stdin); }while(data->EP < 0 || data->EP > 40); printf("\n"); if(data->HP + data->AP + data->DP + data->EP > 300){ printf("パラメータ合計が300を超えています。もう一度入力して下さい。\n\n"); continue; } if(data->HP + data->AP + data->DP + data->EP < 300){ printf("パラメータ合計が300に達していません。もう一度入力して下さい。\n\n"); continue; } else if(data->HP + data->AP + data->DP + data->EP == 300){ break; } } } //ステータス表示関数 void ViewStatus(player data) { printf("名前:%s\n",data.name); printf(" HP :%d\n",data.HP); printf(" AP :%d\n",data.AP); printf(" DP :%d\n",data.DP); printf(" EP :%d\n",data.EP); printf("\n"); }

投稿2017/08/22 16:17

Satooooshi

総合スコア8

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

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

0

加工してみました。

c

1#include <stdio.h> 2#include <string.h> 3#include <ctype.h> 4 5//ステータス構造体 6typedef struct{ 7 char name[256]; 8 int HP; 9 int AP; 10 int DP; 11 int EP; 12} player; 13 14//プロトタイプ宣言 15void InputStatus(player *data); 16void ViewStatus(player data); 17 18int isnum(char *p){ 19 int ii, rr; 20 for(ii=0; ii<strlen(p) && isdigit(*(p+ii)); ++ii) ; 21 return( (ii == strlen(p)) ? 1 : 0 ); 22} 23//メイン関数 24int main() 25{ 26 player data; 27 InputStatus(&data); 28 ViewStatus(data); 29 30 return 0; 31} 32 33//ステータス入力関数 34void InputStatus(player *data) 35{ 36 37 char wk[256]; 38 printf("名前を入力して下さい\n<"); 39 scanf("%s",data->name); 40 printf("%s\n",data->name); 41 while(1){ 42 do{ 43 printf("パラメータ:300を HP、AP、DP、EP(回避)にそれぞれ振り分けて下さい。\n"); 44 printf("※EPの上限は40です。\n"); 45 printf("HP = "); 46 scanf("%s",wk); 47 rewind(stdin); 48 data->HP=(isnum(wk)) ? atoi(wk) : -1; 49 }while(data->HP < 0 || data->HP > 300); 50 51 do{ 52 printf("AP = "); 53 scanf("%s",wk); 54 rewind(stdin); 55 data->AP=(isnum(wk)) ? atoi(wk) : -1; 56 }while(data->AP < 0 || data->AP > 300); 57 58 do{ 59 printf("DP = "); 60 scanf("%s",wk); 61 rewind(stdin); 62 data->DP=(isnum(wk)) ? atoi(wk) : -1; 63 }while(data->DP < 0 || data->DP > 300); 64 65 do{ 66 printf("EP = "); 67 scanf("%s",wk); 68 rewind(stdin); 69 data->EP=(isnum(wk)) ? atoi(wk) : -1; 70 }while(data->EP < 0 || data->EP > 40); 71 72 printf("%d %d %d %d\n", data->HP, data->AP, data->DP, data->EP); 73 if(data->HP + data->AP + data->DP + data->EP > 300){ 74 printf("パラメータ合計が300を超えています。もう一度入力して下さい。\n\n"); 75 continue; 76 } 77 if(data->HP + data->AP + data->DP + data->EP < 300){ 78 printf("パラメータ合計が300に達していません。もう一度入力して下さい。\n\n"); 79 continue; 80 }else if(data->HP + data->AP + data->DP + data->EP == 300){ 81 break; 82 } 83 } 84} 85 86//ステータス表示関数 87void ViewStatus(player data) 88{ 89 printf("名前:%s\n",data.name); 90 printf(" HP :%d\n",data.HP); 91 printf(" AP :%d\n",data.AP); 92 printf(" DP :%d\n",data.DP); 93 printf(" EP :%d\n",data.EP); 94 printf("\n"); 95}

投稿2016/08/29 08:30

A.Ichi

総合スコア4070

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

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

0

scanfの後に数値が入力されているか判断する…といったものを足せばよいのではないでしょうか。

あと、数字のみ入力の例が見つかりましたのでこちらも一応。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1015341095

投稿2016/08/29 05:51

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問