我正在编写一个小命令行程序,它从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);
Run Code Online (Sandbox Code Playgroud)
但是我发现这可能实际上并不正确.imax最终在我的系统上是10,这似乎有点低,而fmax如果是40.(我认为有点高,因为更长的值可以用e表示法表示.)
所以我的问题是:这是解决这个问题的最好方法吗?这甚至是必要的吗?它只是感觉比分配一个256的缓冲区更优雅,并假设它足够了.称之为骄傲; P.
这种类型的东西是我实际使用的地方,fscanf而不是先读入固定大小的缓冲区.如果您需要确保不跳过换行符或其他有意义的空格,则可以使用fgetc逐个字符处理,直到获得数字的开头,然后ungetc再调用fscanf.
如果你想变懒,只需选择像1000这样的大数字......