【发布时间】:2013-02-14 09:22:43
【问题描述】:
我正在开发适用于各种 Unix 和 Windows 32 位和 64 位操作系统的应用程序。
我正在使用long double 数据类型,当我使用sprintf() 并在其中使用long double 和%lf 时,它可以在Windows 上正常工作,不会出现任何类型的错误,但是在Solaris 平台上它会提供核心转储。
相同问题的示例代码如下。
void main(){
string size = "16622";
string sizeFact = "20";
long long sizeLongLong = strtoll(size);
int factInt = atoi(sizeFact);
long double sizeLongDouble = (long double) sizeLongLong/pow(2, factInt);
char buf[512];
sprintf(buf, "%.3lf %s", sizeLongDouble, "str");
}
如上所述,代码在 Windows 32 位和 64 位上运行良好,但对于 sprintf,它为我提供了 Solaris 上的核心。
我尝试在 sprintf 中进行类型转换,效果很好。
sprintf(buf, "%.3lf %s", (double) sizeLongDouble, "str");
long double 的格式说明符是什么?
我在这里犯了什么错误,我是否使用了错误的格式说明符,因为它提供了核心?
为什么我需要在 sprintf() 中再输入一次强制类型转换?
【问题讨论】: