我的朋友被分配到他公司的现有C ++项目上工作。在源代码中他看到了类似的东西:
char* tmp = "882.30";
char buff[32];
sprintf(buff, "%e", tmp);
printf("TEST: %s\n", buff);
编译时,会发出警告:warning: format '%e' expects type 'double', but argument 3 has type 'char*'
但输出结果令人惊讶:8.823000e+002
。他很好奇。怎么会这样?
为了澄清他创建了一个新的小项目,他使用了相同的上面的代码片段和相同的编译器,但它显示了非常不同的结果:2.647480e-314
。
环境:Centos 5.x,gcc 4.4.7。
这可能是什么原因?现有项目有sprintf或编译器的重载功能吗?
答案 0 :(得分:2)
这是未定义的行为。
C99§7.19.6.1/ 9
如果任何参数不是相应的正确类型 转换规范,行为未定义。
这意味着您可以保证获得不可移植的结果/行为。
答案 1 :(得分:0)
您需要atof
明确地将char *
指针转换为double
#include <cstdio>
#include <cstdlib>
int main( void )
{
const char* tmp = "882.30";
char buff[32];
sprintf(buff, "%e", atof( tmp ));
printf("TEST: %s\n", buff);
return 0;
}
顺便说一句,你不能覆盖现有的功能,因为这违反了
一个定义规则(ODR。)