Sscanf 将读取整数而不是双精度数 (c)?

Posted

技术标签:

【中文标题】Sscanf 将读取整数而不是双精度数 (c)?【英文标题】:Sscanf will read ints but not doubles (c)? 【发布时间】:2022-01-09 07:04:42 【问题描述】:

我将以下内容存储在 char 数组中

"1, 1.0, 1.000, 1.0000"

我正在尝试将其解析为一个 int 和三个双精度数

sscanf(myString, "%d %lf %lf %lf", &(myStruct->I1), &(myStruct->D1), &(myStruct->D2), &(myStruct->D3);
printf("%d %lf %lf %lf", myStruct->I1, myStruct->D1, myStruct->D2, myStruct->D3);

输出

1 0.000000 0.000000 0.000000

【问题讨论】:

把它变成minimal reproducible example。应该不难 什么会消耗逗号? 始终检查scanf及其亲属的返回值。 sscanf(myString, "%d ,%lf ,%lf ,%lf", ... )。这样做会捕获逗号之前的任何空格,而逗号之后的任何空格都会被%lf 说明符自动捕获。 好的,谢谢!我错过了逗号! 【参考方案1】:

源字符串包含逗号。所以需要在sscanf的调用中更改格式字符串。

你来了。

#include <stdio.h>

int main( void ) 

    char myString[] = "1, 1.0, 1.000, 1.0000";
    struct myStruct
    
        int I1;
        double D1;
        double D2; 
        double D3;
     myStruct;
    
    sscanf( myString, "%d%*[ ,]%lf%*[ ,]%lf%*[ ,]%lf", 
            &myStruct.I1,&myStruct.D1, &myStruct.D2, &myStruct.D3 );
             
    printf( "%d, %.1f, %.2f, %.3f\n", 
            myStruct.I1, myStruct.D1, myStruct.D2, myStruct.D2 );
    
    return 0;

程序输出是

1, 1.0, 1.00, 1.000

格式字符串可以看起来更简单

"%d ,%lf ,%lf ,%lf"

注意在printf中使用时,长度修饰符l在转换说明符%lf中是多余的。

【讨论】:

以上是关于Sscanf 将读取整数而不是双精度数 (c)?的主要内容,如果未能解决你的问题,请参考以下文章

基本 Java:判断双精度数是不是为整数的方法

检查双精度值是不是为整数 - Swift

SSE2:将二维数组中的有符号整数与双精度数相乘并将结果相加在 C 中

取一个双精度浮点数,并输出它(保留小数点后8位),

如何在R中将两个变量(整数)转换为双精度?

是否可以保真地将浮点双精度数往返于两个十进制整数?