#include int getfloat(float* ans); int shousu(float* ans); void keyflush(int input); /* ----- 滅入ん ----- */ void main() { float input; printf("実数値を入力:"); if (getfloat(&input) == EOF) { printf("実数値を入力して下さい!\n"); } else { printf("結果表示:[%f]\n", input); } } /* ----- 関数の定義 ----- */ int getfloat(float* ans) { int input; /* 1 文字入力の値 */ int sign = 2; /* 最初のループ時:2 整数:0 負数:1 */ *ans = 0; /* 文字→数値変換の結果を初期化 */ while ((input = getchar()) != '\n') { if (sign == 2) { /* 符号判定 ※最初の 1 回のみ実行される */ if (input == '-') { /* 負数の時 */ sign = 1; /* 負数フラグ On */ input = getchar(); /* '-' を読み飛ばす */ } else { sign = 0; /* 負数フラグ Off */ } } if (input == '.') { /* 「しょうすうてん」があらわれた!! */ if (shousu(ans) == -1) { /* 小数部の入力が異常 */ return -1; } else { break; /* うまく変換できたらループを抜ける */ } } if (input >= '0' && input <= '9') { *ans = (*ans * 10) + (input - '0'); /* 文字数字を 10 進数に変換 */ } else { keyflush(input); return -1; /* 数字以外の入力ならエラー (-1) */ } } if (sign == 2) { /* 改行だけの入力はエラー */ keyflush(input); return -1; } if (sign) { *ans *= -1; /* 負数の時はそんな感じで */ } return 0; } void keyflush(int input) { while (input != '\n') { /* 入力バッファのクリア簡易版 */ input = getchar(); } } int shousu(float* ans) /* 小数部の変換のみ受け持つ関数 */ { int input; float i = 1; /* 繰り返しカウンタ ※ 1 文字読み込んだら増やす */ while ((input = getchar()) != '\n') { i *= 10; /* 繰り返しカウンタを増やす */ if (!(input >= '0' && input <= '9')) { return -1; /* 数字以外の入力ならエラー (-1) */ } *ans = *ans + ((input - '0') / i); /* 小数部向けな演算 */ } return 1; }