我在寫一個小型命令行程序,它從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