You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C++17 MinGW环境下使用sscanf解析浮点数失败,如何解决?

如何在C17(MinGW g)中用sscanf正确解析double类型浮点数?

你踩了sscanf格式说明符匹配的坑啦!问题核心是格式符和变量类型不对应%f是专门给float类型变量用的格式化输入符,而你声明的是double类型变量,这直接导致内存读写错位,所以输出了一堆无意义的垃圾值。

一步解决:把%f换成%lf

sscanf里的%lf才是对应double类型的格式说明符,修改后的代码就能正常工作了:

std::string s("driver at 1 3");
double c, d;
sscanf( s.c_str(), "%*s %*s %lf %lf", &c, &d );
std::cout << c <<" "<< d <<"\n";

不管你输入的是整数形式的1 3,还是带小数的1.0 3.0,这段代码都能正确解析出对应的数值。

额外小提示

  • 别搞混printfsscanf的格式符规则:printf%f可以同时处理floatdouble(因为float会自动提升为double),但sscanf对类型的要求更严格,double必须用%lffloat%f
  • 如果是在C++17及以后的环境,其实可以考虑用更现代的std::from_chars来做字符串解析,它类型安全、不需要C风格字符串转换,性能也更优。不过要是你习惯用sscanf,只要保证格式符和变量类型匹配就完全没问题。

内容的提问来源于stack exchange,提问作者ravenspoint

火山引擎 最新活动