如果我这样做:
void printfloat(float number)
{
printf("%f", number);
}
Run Code Online (Sandbox Code Playgroud)
和
void printdouble(double number)
{
printf("%f", number);
}
Run Code Online (Sandbox Code Playgroud)
每个函数可以输出的最大字符数是多少?
小智 6
通过测试,使用MS Visual Studio 10,得到一串811
sprintf(buf, "%.*f", 500, -DBL_MAX);
Run Code Online (Sandbox Code Playgroud)
当然,更长的字符串可以具有更大的精度值。
但继续使用“%f”,“\0”的最大输出字符数为 317 + 1。
所以对于可移植代码:
#include <float.h>
#include <stdio.h>
char buf[1/*'-'*/ + (DBL_MAX_10_EXP+1)/*308+1 digits*/ + 1/*'.'*/ + 6/*Default? precision*/ + 1/*\0*/];
sprintf(buf, "%f", -DBL_MAX);
Run Code Online (Sandbox Code Playgroud)
函数 printfloat(float number) 的唯一参数“number”是一个浮点数并且限制在浮点数的范围内,在传递给 sprintf() 时被转换为双精度数。因此它的最大值是FLT_MAX。因此,'\0' 的最大输出字符数为 47 + 1。
char buf[1/*'-'*/ + (FLT_MAX_10_EXP+1)/*38+1 digits*/ + 1/*'.'*/ + 6/*Default? precision*/ + 1/*\0*/];
sprintf(buf, "%f", -FLT_MAX);
Run Code Online (Sandbox Code Playgroud)
结论:
我无法让 snprintf 告诉我字符串有多大,并且我希望使代码尽可能独立于编译器。所以这是我想出的解决方案。
char numstr[50];
sprintf_s(numstr, "%g", *value);
m_stringRepresentation += numstr;
Run Code Online (Sandbox Code Playgroud)
%g 以科学记数法输出数字,这严重限制了字符数。我选择了一个足够大的缓冲区来容纳可能输出的任何内容。我唯一的编译器依赖是 sprintf_s。