我正在开发适用于各种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()中再次输入强制转换?
答案 0 :(得分:20)
对于long double
,您应该使用格式"%Lf"
。使用小L(即"%lf"
)格式化对POSIX系统没有影响(参见the specification)。
答案 1 :(得分:3)
The documentation非常清楚:
<强>→强>
以下 a,A,e,E,f,F,g 或 G 转换对应于long double参数。 (C99>允许%LF,但SUSv2不允许。)
因此,您应该使用%Lf
。
答案 2 :(得分:0)
根据编译器,我看到%Lf
和%llf
尝试两者,看看哪些有效。您使用的%lf
是double
的格式说明符,而不是long double
的格式说明符。我相信g++
你应该使用%llf
,而在visual studio上它是%Lf
。
答案 3 :(得分:0)
我会将此添加为评论,但我还不能这样做。同样重要的是要注意,您也可以使用指数&#39; p&#39;以这种方式表示long double
:
%Lf
%Le
%La