c语言sscanf得到double数据

本文详细解释了如何正确使用sscanf/fscanf/scanf等函数来处理不同类型的浮点数输入。特别是强调了在扫描double类型变量时必须使用%lf而非%f的重要性,并解释了背后的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

是这样子的,在用sscanf/fscanf/scanf来扫描指定字符串按特定格式存储到变量时,需要指定合适的convention specifier,而type modifier有时可以忽略。但是在有些时候,type modifier是必须的,不指定type modifer会得不到期望的输入。以float/double类型为例:
float fvalue;
double dvalue;
scanf("%f", &fvalue) -------------> 将标准输入存储到float类型变量
scanf("%lf", &dvalue) ------------> 将标准输入存储到double类型变量
现在看,如果用"%f" 来转化存储double类型变量会有什么结果?

scanf("%f", &dvalue) -------------> dvalue的值将不会是你期望的浮点值,多数情况下是0

现在再看 convention specifier:
f ---------- 匹配一个有符号浮点数;下一个指针必须是浮点数的指针。(那么问题来了,double--8字节,也是浮点数,float--4字节也是浮点数,困惑么?)

再看type modifier:

l --------- 指示convention将会是d,i,o,u,x,X 或者n中的一个并且下一个指针必须是指向长整型或者无符号长整型(而不是4字节的整型),或者指定convention将是e,f或g中的一个并且下一个指针必须是指向double(而不是4字节的float)。

看到这里,我想你已经清楚为何不能用"%f" 来对应double了。

至于为什么会出现这样的情况,是因为标准库对于变参(sscanf/scanf/fscanf的格式化参数是变参)的处理原理。标准库利用va_start/va_arg/va_end 宏来处理变参。其本质是通过指针给你的变量赋值,所以标准库需要知道你的变量的长度。int是4个字节,long int 是8个字节;同样float是4个字节,double是8个字节。试想将8个字节的内存存储的值,以指针操作内存的方式存储到4个字节内存中,会出现什么情况? “截断”,就是“截断”,因为出现了截断,所以你得到的值,只是8个字节中的低MSB或者高MSB的4个字节而已,因此值不是你想要的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值