使⽤sprintf打印float并控制⼩数位数时引起的问题
最近在做项⽬中发现⼀个Bug,直接把进程搞死,查了⼀下,居然是⼀个最不起眼的地⽅导致的,在此记录⼀下。
先看下⾯代码
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
char aa[1024] = {0};
float f = 50.123456;
// 本意是想把⼀个浮点数输出到字符串中,⼩数位为两位,漏了
浮点型变量floatsprintf(aa, "%0.*f", f);
printf("%f\n", f);
cout<<aa<<endl;
sprintf(aa, "%0.*f", 2, f);
cout<<aa<<endl;
cout << "Hello world!" << endl;
return0;
}
运⾏结果如下
代码中,sprintf(aa, "%0.*f", f);是想把⼀个浮点数输出到字符串中,且想控制⼩数点后的位数,但是在后⾯没有传参数指定⼩数点位数,导致sprintf打印了⼀长串数据到变量aa中。当aa的空间不⾜时,就会使得数组越界,导致程序崩溃。在项⽬中进程被搞死的原因就在于此。⾄于sprintf函数内部是怎么打印出这么长⼀串数据的,等看了源码后再分析。