我有一个 .dad 文件,内容如下

1/2

我希望从文件中读取并将值保存0.5double使用中fscanf,但该方法将其读取为1.000


为了完全清楚,这里是代码和输出:

#include <stdio.h>

int main(void){
    
    /* Open the file */
    FILE * file ;
    file = fopen ("test.dad", "r");
    if ( file == NULL ){
        printf("Error opening %s\n", ".dad file."); 
        return 1;
    }

    /* Import data to x */
    double x = 0;
    fscanf(file, "%lf", &x);      
    fclose(file); 

    /* Print x */
    printf("%lf\n", x);
    return 0;
}

输出:

1.000000

4

  • 5
    fscanf 不理解符号(number)/(number)。您必须自己构建它。


    – 

  • 1
    fscanf被告知要读取一个浮点值。它读取了1,下一个字符是非数字(/),因此它停止并正确读取值1.0。您需要读取表达式并自己执行数学运算1以除以2得到0.5


    – 

  • 如果您知道有两个数字之间用 分隔/,那么您可以分别读取两个数字,然后自行执行除法。


    – 

  • 是否保证总是有两个整数被 a 分隔/,而没有其他内容(甚至没有空格)?或者您是在问如何处理任何类型的数学表达式5 * 3 / 2 + 5?请您的问题以澄清这一点。


    – 



最佳答案
2

您得到的是,1.0因为它仅成功解析11/2。它不知道如何处理/。在这种情况下,您需要读取两个相隔的整数/,然后使用double精度将它们相除。

例子:

#include <stdio.h>

int main(void) {
    char line[] = "1/2";
    int num, denom;
    if (sscanf(line, "%d/%d", &num, &denom) == 2) {
        double x = (double)num / (double)denom;
        printf("%lf\n", x);                        // prints 0.5
    }
}

  1. scanf不计算任何表达式。它只读取(在你的情况下为浮点型)常量

  2. 如果要评估以字符串形式输入的表达式,则需要使用第三方库 – 例如 tinuExpr

例如:

int main(void)
{
    char str[100];
    fgets(str, sizeof(str), stdin);
    printf("Result: %f\n", te_interp(str, 0));
}

当你输入1/2结果时0.500000

你的表达: