使用sprintf打印float並控制小數位數時引起的問題


最近在做項目中發現一個Bug,直接把進程搞死,查了一下,居然是一個最不起眼的地方導致的,在此記錄一下。

先看下面代碼

#include <iostream>
#include <stdio.h>

using namespace std;


int main()
{
    char aa[1024] = {0};
    float f = 50.123456;

    // 本意是想把一個浮點數輸出到字符串中,小數位為兩位,漏了
    sprintf(aa, "%0.*f", f);
    printf("%f\n", f);
    cout<<aa<<endl;

    sprintf(aa, "%0.*f", 2, f);
    cout<<aa<<endl;

    cout << "Hello world!" << endl;

    return 0;
}

 

運行結果如下

 

代碼中,sprintf(aa, "%0.*f", f);是想把一個浮點數輸出到字符串中,且想控制小數點后的位數,但是在后面沒有傳參數指定小數點位數,導致sprintf打印了一長串數據到變量aa中。當aa的空間不足時,就會使得數組越界,導致程序崩潰。在項目中進程被搞死的原因就在於此。至於sprintf函數內部是怎么打印出這么長一串數據的,等看了源碼后再分析。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM