使用sprintf打印float并控制小数位数时引起的问题
2014-07-04 20:11
375 查看
最近在做项目中发现一个Bug,直接把进程搞死,查了一下,居然是一个最不起眼的地方导致的,在此记录一下。
先看下面代码
运行结果如下
代码中,sprintf(aa, "%0.*f", f);是想把一个浮点数输出到字符串中,且想控制小数点后的位数,但是在后面没有传参数指定小数点位数,导致sprintf打印了一长串数据到变量aa中。当aa的空间不足时,就会使得数组越界,导致程序崩溃。在项目中进程被搞死的原因就在于此。至于sprintf函数内部是怎么打印出这么长一串数据的,等看了源码后再分析。
先看下面代码
#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函数内部是怎么打印出这么长一串数据的,等看了源码后再分析。
相关文章推荐
- 关于Java控制小数位数的问题
- C++使用fixed和precision控制小数和有效位数的输出
- 二柱子问题扩充:1题目避免重复;2可定制(数量/打印方式);3 可以控制下列参数:是否有乘除法,是否有括号,数值范围,加减有无负数,除法有无余数,是否支持分数(真分数,假分数,...),是否支持小数,(精确到多少位),打印中每行的间隔可调整;
- 使用cout输出小数时位数的控制方法
- 在JSP中使用formatNumber控制要显示的小数位数
- java控制float类型的小数位数
- JAVA中double格式化控制精度小数位数,float同理
- 小数位数向上取整引起的数值不够问题
- 在JSP中使用formatNumber控制要显示的小数位数方法
- 四则运算问题扩充:1、题目避免重复;2、可定制(数量/打印方式);3、可以控制下列参数: 是否有乘除法、是否有括号、 数值范围、加减有无负数、除法有无余数、否支持分数 (真分数, 假分数, …)、是否支持小数 (精确到多少位)、打印中每行的间隔可调整;
- java控制float类型的小数位数
- 使用Delphi控制条码打印机打印条码(系列问题1)
- JAVA中double格式化控制精度小数位数,float同理
- C#使用window API 控制打印纸张大小
- if 语句不使用代码块引起的问题
- 在使用了MasterPage后,FindControl()函数引起的问题
- 使用网上流传的一个数据库连接池在Proxy.newProxyInstance处引起 java.lang.ClassCastException 问题的解决方法
- ACE上打印控制莫名其妙的问题
- Web项目中使用NLog记录日志,利用单件模式控制整个项目只有一个Logger对象的问题
- 使用参数控制水晶报表的部分元素不打印