我在写一个小型命令行程序,它从stdin中读取两个浮点数,一个int和一个小字符串(最多4个字符)。我试图找出我应该创建并传递给fgets的缓冲区大小。我想我可以基于有多少位应该分别,像这样列入float
和int
最大值计算这个读取浮点的最小缓冲区长度
#include <float.h>
#include <limits.h>
...
int fmax = log10(FLOAT_MAX) + 2; // Digits plus - and .
int imax = log10(INT_MAX) + 1; // Digits plus -
int buflen = 4 + 2*fmax + imax + 4; // 4 chars, 2 floats, 1 int, 3 spaces and \n
...
fgets(inbuf, buflen + 1, stdin);
但它发生,我认为这可能实际上并不正确。 imax
最终在我的系统上是10,这似乎有点低,而fmax
如果40.(我认为这有点高,因为较长的值可能用e符号表示。)
所以我的问题是:这是解决这个问题的最好方法吗?这甚至是必要的吗?它比分配256的缓冲区感觉更优雅,并且假设它足够了。称它为骄傲的问题; P。
请问您的问题时,请在C和C++之间进行选择。根据您使用的语言,答案会有所不同。 –
你为什么要为int和浮点数使用不同的缓冲区?无论如何,你必须一个接一个地阅读它们,所以要采用一个足够大的缓冲区来容纳浮动块并完成它。 – arne
另请参见INT_MAX,看看它在base-10表示中真的只有十位数。然后考虑双倍(64位,53位尾数),你可能会看到40位数字听起来是正确的。 – arne