- ベストアンサー
入力チェック・・・
何が違うのかわからないんです・・・ どうか教えてください。 /**== 入力値をチェック ==**/ /* 入力値が0以下の数字、或いは数字以外の文字の場合 */ while((number <= 0) || (isdigit(number) == 0)) { /* エラーメッセージを表示します */ printf("2以上の数字を入力してください。\n"); /* 数を入力させる準備メッセージを表示 */ printf("number = "); /* キーボードからの入力を受け付ける */ fgets(str, sizeof(str), stdin); /* 文字列を数値に読み替える */ number = atoi(str); } …とソースを書いたのですが、無限ループになってしまいます…。 isdigitがうまく働いていないようなのですが、どう したらよいか、わかりません…。 解決方法を教えてください!
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#include <stdio.h> #include <stdlib.h> #include <ctype.h> void main(void){ char str[16]; int number; int error; char *p; do{ error=0; printf( "2以上の数字を入力してください。\n" "number = "); fgets(str, sizeof(str), stdin); for(p=str;*p!='\n' && *p;p++){ /* 一文字ずつ調べる */ if(!isdigit(*p)){ /* 数字文字以外が含まれていた */ error=1; /* エラー発見 */ printf("数字以外の文字が含まれています\n"); break; } } if(error) continue; /* エラーが起こっている時以下はスキップする */ number = atoi(str); if(number < 2){ /* 2より小さい値が入力された */ error=1; /* エラー */ printf("2より小さい数字が入力されました\n"); } }while(error); /* エラーがあれば繰り返す */ }
その他の回答 (2)
- norisenbei
- ベストアンサー率13% (10/76)
こう書くと判りやすいかな? int number = 0; char c = 0x00; char str[1024]; /**== 入力値をチェック ==**/ /* 入力値が0以下の数字、或いは数字以外の文字の場合 */ while((number <= 0) || (isdigit((int)c) == 0)) { /* エラーメッセージを表示します */ printf("2以上の数字を入力してください。\n"); /* 数を入力させる準備メッセージを表示 */ printf("number = "); /* キーボードからの入力を受け付ける */ fgets(str, sizeof(str), stdin); /* 文字列を数値に読み替える */ number = atoi(str); /* 文字列の1桁目を取得 */ c = str[0]; /* 入力値を確認 */ printf("number == %i, code == 0x%x\n", number, (int)c); } isdigit(int c)の引数は数値じゃなく、文字コードでし。 たぶんASCII環境でしょうから int型の1 じゃなく char '1' == 0x31 == 49 質問時のプログラムで入力値49とか入れると動くと思います。 参考URLとか見てみてください。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
whileに入る前numberは、どんな値になっていますか? atoiしていることから多分intだと思いますが、 isdigitの引数は、char(1文字の文字)です。 数字以外というチェックはatoiする前にやらなくちゃいけません 無限ループする理由は、 atoiして、numberは数字になりますが それが、0~9の文字コードにならないので、 (isdigit(number) == 0)の部分が成り立ち、 無限ループしているのではないかと思います。
お礼
ご指摘どおり、whileに入る前numberはintでした。 そこで、文字以外と0以下の数字と2パターンに分けて 文字以外の条件文のあとにatoiしてみたのですが、 うまくいかず・・・。 何か策ありませんでしょうか??
お礼
丁寧なご指導ありがとうございます! ただ、私には難しすぎていまいち理解できません(泣) 試しにコピー&ペーストして自分のソースに組み込んで みたら、どんな数字を入れてもまず、 「2以上の数字を入力してください」とエラーメッセージが・・・。 どうしたもんでしょう??何か策ありますか??