[英]How do I prevent buffer overflow converting a double to char?
我正在將雙精度型轉換為char字符串:
char txt[10];
double num;
num = 45.344322345
sprintf(txt, "%.1f", num);
並使用“ .1f”將小數位截斷到十分位數。
即-txt包含45.3
我通常在sprintf中使用precision以確保char緩沖區不會溢出。 我如何在不使用snprintf的情況下也將小數點截斷?
(即,如果出於某些原因,num = 345694876345.3)
謝謝
編輯如果num>緩沖區,則結果不再重要,只是不想崩潰。 不知道在那種情況下最有意義的是什么。
EDIT2我應該比在標簽中更清楚地表明這是一個C程序。 我在C程序中使用snprintf時遇到問題。 我不想添加任何第三方庫。
使用snprintf()
,它將告訴您未打印多少字節。 通常,應將數組的大小設置為足夠大,以處理目標整數類型的最長字符串表示形式。 如果事先不知道,請使用malloc()
(或asprintf()
,這是非標准的,但存在於許多平台上)。
編輯
如果格式超出給定的緩沖區, snprintf()
會正常失敗,它不會溢出。 如果您不需要處理該問題,那么只需使用它即可解決您的問題。 我想不出一個您不想處理它的實例,但是話又說回來,我不在處理您正在處理的任何事情:)
為什么不只使緩沖區足夠大以容納雙精度的最大字符串表示形式?
假設使用IEEE標准的浮點算術進行64位雙精度運算,其中尾數使用52位:2 ^ 52 = 4,503,599,627,370,500。 因此,我們需要16個字符來保留小數點前后的所有數字。 19考慮小數點,符號字符和空終止符。
我只會使用至少20個字符的緩沖區大小並繼續前進。
如果需要使用科學計數法打印雙精度圖,則需要為指數增加足夠的空間。 假設一個11位帶符號的指數,則該指數又是4個字符,再加上一個指數和字母'E'。 在這種情況下,我只會輸入30個字符。
如果您絕對必須自己執行此操作,請先嘗試計算數字,然后再嘗試進行轉換:
int whole = num;
int wholeDigits = 0;
do {
++wholeDigits;
}
while (whole /= 10);
double fraction = num - (int) num;
int decimallDigits = 0;
while (fraction > 0) {
++decimalDigits;
fraction *= 10;
fraction = fraction - (int) fraction;
}
int totalLength = decimalDigits ? wholeDigits + decimalDigits + 1 : wholeDigits;
在依靠它來防止崩潰之前,您可能應該驗證此即席代碼是否如所宣傳的那樣工作。 我建議您使用snprintf
或類似的東西代替我的代碼,就像其他人所說的那樣。
為什么要在沒有snprintf
情況下這樣做? 無論您的格式字符串是否包含雙snprintf
,另一個字符串或其他任何內容,都應該使用snprintf
。 據我所知,沒有理由不這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.