- ベストアンサー
文字と数字の判定について
- c言語を学び始めたばかりの者による数当てゲームのプログラムです。
- プログラムの中で数字の判定の仕方が分からず、質問しています。
- 条件分岐における数字の判定について教えてもらいたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
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に代入します。
その他の回答 (2)
- tsuduki123
- ベストアンサー率32% (21/65)
基本は #1 の人が言うように fgets() を利用して入力をうけとります。 あとは、取得されたバッファをチェックして、数字に変換ですかね。 チェックの方法はいろいろと好みがありますけど この場合は数値変換できればよいので strtol() を使うのが楽かなと思います。 # **endptr == '\0' なら数値のみ Linux用のページですけどPOSIX関数はどのOSでも同じでしょうから 個々の関数の使い方や違いは調べてみてください。 おすすめは - strtol - strspn - sscanf あたりですかね~
- 参考URL:
- http://www.linux.or.jp/JM/
お礼
ありがとうございました。
- SnowShower
- ベストアンサー率40% (140/348)
>勉強不足で申し訳ないのですが >if (!isdigit(buf[i])) >ってどういう意味なのでしょうか? 回答をしっかり読んでますか? No.1氏の回答に >数字かどうかはisdigit(buf[0])すると判定できます。 とあります。 isdigit()は「数字」(数値ではなく、'0'~'9'の文字)かどうかを判断する関数です。 つまり、buf[]に格納された内容が全て数字かどうかを判断しています。 >nodigit >ってなんなのでしょうか? 「No Digit」つまり「数字ではない」という意味でしょう。 本来なら、その先にnodigitをフラグとして数字以外が入力された場合の処理があるはずです。
お礼
ありがとうございました
補足
>if (!isdigit(buf[i])) このような書きかたが出来ることを知らなかったのでごめんなさい。
お礼
出来ました!! ありがとうございました!!
補足
勉強不足で申し訳ないのですが if (!isdigit(buf[i])) ってどういう意味なのでしょうか? nodigit ってなんなのでしょうか?