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,这段代码都能正确解析出对应的数值。
额外小提示
- 别搞混
printf和sscanf的格式符规则:printf里%f可以同时处理float和double(因为float会自动提升为double),但sscanf对类型的要求更严格,double必须用%lf,float用%f。 - 如果是在C++17及以后的环境,其实可以考虑用更现代的
std::from_chars来做字符串解析,它类型安全、不需要C风格字符串转换,性能也更优。不过要是你习惯用sscanf,只要保证格式符和变量类型匹配就完全没问题。
内容的提问来源于stack exchange,提问作者ravenspoint




