我正在工作的应用程序,在各种风格的Unix和Windows的32位和64位操作系统。
我使用的是long double
数据类型,当我使用sprintf()
并使用带有%lf
的long double
时,它在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()中再次输入cast?
发布于 2013-02-14 17:27:24
对于long double
,您应该使用format "%Lf"
。使用小L(即"%lf"
)进行格式化对POSIX系统没有影响(请参阅the specification)。
发布于 2013-02-14 17:25:10
根据我见过的编译器,%Lf
和%llf
都尝试了一下,看看哪一个能正常工作。您使用的%lf
是double
的格式说明符,而不是long double
的格式说明符。我相信在g++
上你应该使用%llf
,而在visual studio上你应该使用%Lf
。
https://stackoverflow.com/questions/14871466
复制相似问题