- ベストアンサー
文字の数値化 関数化
文字を入力されたとき、数値入力を促す関数を作りたいのですが、 最初の文字が文字ならエラーメッセージがちゃんと出るのですが、 最初の文字が数字ならエラーメッセージが出てくれません。 アドバイスお願いいたします。 tew2 ← エラー出る 2test ← エラー出ない #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> float ss_input(void); int main(){ int i; int pop; printf("何人の入力しますか(3人以内)->"); do{ pop=ss_input(); if(pop >3) printf("3人以内でお願いします\n"); }while(pop<1 || pop>3); return 0; } float ss_input(void){ char p[100]; float st; int i=0; scanf("%s",p); while( p[i] != '\0'){ if(isdigit(p[i])==0){ printf("数値を入力してください->"); scanf("%s",p); continue; } else{ break; } } st=atof(p); return st; }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
取りあえず、文字列pがすべて数字かどうかを調べる関数(例えば、 int is_all_digit( char *p ) のような)を作って、ss_input内から呼ぶようにしてみたらいかがでしょうか?つまり、ss_input内で while( !is_all_digit( p ) ){ ... } などとやると、何をやりたいかが分かりやすいですので。 あと、ss_inputの戻り値がfloatですが、mainのpopはintですね。 floatは必要なさそうなので、たぶん、ss_inputの戻り値をintにした方がいいと思います(atof()ではなく、atoi()を使うなどして)。 現在、事情で私自身でプログラムの動作を確認できないので、読んだだけですが。
その他の回答 (3)
- salsberry
- ベストアンサー率69% (495/711)
修正版で、continueの直前にi++しているのはどういう意図によるものですか? 入力をやり直したのですからもう一度文字列の先頭からチェックしなくてはいけないのでは?
お礼
ありがとうございます。 i++入りませんでした。
- asuncion
- ベストアンサー率33% (2127/6289)
>下記に直しましたが、動きが今いちおかしいです。 どのようにおかしいか、を具体的に書いてください。 どういう結果を想定していて実際にはどうなるので、 「おかしい」と判断されたかを示すことが必要です。
補足
説明不足ですみません。 数字、文字を入力したとき、エラーが出たり、出なかったりしてしまいます。文字が入っていたら毎回エラーが出てほしいです。
- salsberry
- ベストアンサー率69% (495/711)
変数iは何のためのものですか? 0で初期化された後値が変化していませんがそれでいいですか? 現状だとisdigit(p[0])の結果が0以外の場合にすぐwhileループから抜けてしまいます。
補足
main の i は入りませんでした。(見直しミスでした) 関数 ss_input の i は、文字列 pをみたいです。 プログラムミスです。 下記に直しましたが、動きが今いちおかしいです。 アドバイスお願いいたします。 float ss_input(void){ char p[100]; float st; int i=0; scanf("%s",p); while( p[i] != '\0'){ if(isdigit(p[i])==0){ printf("数値を入力してください->"); scanf("%s",p); i++; continue; } i++; } st=atof(p); return st; }
お礼
ありがとうございました! 切羽詰まって見よう見真似で自分が書いたソースが何をしているのかよくわかりませんでしたが、while( !is_all_digit( p ) )をつかって整理したら、わかりやすくなり、プログラムも動きました! アドバイスありがとうございました!