字符串转换为整数而不是double

时间:2016-11-17 00:31:21

标签: c double

我希望我的函数将字符串转换为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;


}

1 个答案:

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