我希望我的函数将字符串转换为double,但如果我键入例如'22 .4',它将输出'22'。如何让它输出双倍?(使用fgets)我已经阅读了其他问题,这些问题有答案说使用sscanf但有没有办法使用fgets?
double getDouble(char message[]){
double val;
double var = 0.0;
char input[80];
do{
printf("%s\n", message);
fgets(input, 80, stdin);
if (input[strlen(input)-1] == '\n'){
input[strlen(input)-1] = '\0';
}
val = atof(input);
if (val != 0.0){
var = 1.0;
}
else{
printf("Error. Please try again.(Only entering numbers is valid)\n");
}
}while(var == 0.0);
printf("The result is: %f\n", val);
return val;
}
答案 0 :(得分:1)
这是一个有效的例子。
一些修改:
near_equal()
函数,因为测试双精度等同是危险的。var = 0.0
,而不是使用int
等双重标记?检查fgets
的返回值总是一个好主意。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define BUFFSIZE 80
#define EPSILON 1e-8
double getDouble(char message[]);
int double_equal(double a, double b);
int
main(void) {
double num;
num = getDouble("Enter a real number: ");
printf("The result is: %.1f\n", num);
printf("The number you entered was %g\n", num);
return 0;
}
double
getDouble(char message[]) {
double val;
char input[BUFFSIZE];
int found = 0;
do {
printf("%s\n", message);
if (fgets(input, BUFFSIZE, stdin) != NULL) {
if (input[strlen(input)-1] == '\n'){
input[strlen(input)-1] = '\0';
}
val = atof(input);
if (!double_equal(val, 0.0)) {
found = 1;
} else {
printf("Error. Please try again.(Only entering numbers is valid)\n");
}
}
} while (found == 0);
return val;
}
int
double_equal(double a, double b) {
return fabs(a-b) < EPSILON;
}