こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

文字の数値化 関数化

文字を入力されたとき、数値入力を促す関数を作りたいのですが、
最初の文字が文字ならエラーメッセージがちゃんと出るのですが、
最初の文字が数字ならエラーメッセージが出てくれません。
アドバイスお願いいたします。

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;
}

投稿日時 - 2009-11-23 18:08:08

QNo.5470200

すぐに回答ほしいです

質問者が選んだベストアンサー

取りあえず、文字列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()を使うなどして)。

現在、事情で私自身でプログラムの動作を確認できないので、読んだだけですが。

投稿日時 - 2009-11-23 22:13:57

お礼

ありがとうございました!
切羽詰まって見よう見真似で自分が書いたソースが何をしているのかよくわかりませんでしたが、while( !is_all_digit( p ) )をつかって整理したら、わかりやすくなり、プログラムも動きました!
アドバイスありがとうございました!

投稿日時 - 2009-11-24 21:09:16

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

修正版で、continueの直前にi++しているのはどういう意図によるものですか?
入力をやり直したのですからもう一度文字列の先頭からチェックしなくてはいけないのでは?

投稿日時 - 2009-11-23 20:51:04

お礼

ありがとうございます。
i++入りませんでした。

投稿日時 - 2009-11-24 00:08:24

ANo.2

>下記に直しましたが、動きが今いちおかしいです。

どのようにおかしいか、を具体的に書いてください。
どういう結果を想定していて実際にはどうなるので、
「おかしい」と判断されたかを示すことが必要です。

投稿日時 - 2009-11-23 20:10:57

補足

説明不足ですみません。
数字、文字を入力したとき、エラーが出たり、出なかったりしてしまいます。文字が入っていたら毎回エラーが出てほしいです。

投稿日時 - 2009-11-24 00:03:01

ANo.1

変数iは何のためのものですか? 0で初期化された後値が変化していませんがそれでいいですか?
現状だとisdigit(p[0])の結果が0以外の場合にすぐwhileループから抜けてしまいます。

投稿日時 - 2009-11-23 19:17:19

補足

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;
}

投稿日時 - 2009-11-23 19:24:51

あなたにオススメの質問