簡體   English   中英

如何防止緩沖區溢出將雙精度數轉換為char?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM