2 xh931076284 xh931076284 于 2015.07.18 10:47 提问

c sprintf函数第一个参数可以使动态数组吗?

string str="1234.56";
char *ch = new char[str.length()+1];
double tude = atof(str.c_str());
sprintf(ch, "%.5f", tude);
这样格式化double的变量,在内存的读取上存在问题吗?

4个回答

91program
91program   Ds   Rxr 2015.07.18 11:00

会有问题
因数浮点数精度的问题,可能格式出来需要的空间比原始的字符串空间要大。所以,会出来内存访问越界的问题!

1234.56 在使用浮点数表示时可能是:1234.5599999

xh931076284
xh931076284 回复91program: 用valgrind 在Linux下测试了,存在非法读写内存的错误,但是运行没问题
2 年多之前 回复
91program
91program 回复xh931076284: 小数点后保留 5 位为:1234.55999,格式化的字符串也是:1234.55999。但你的 ch 只有8字节,明显已经越界了!;%.5f指定待打印的浮点数后有五位小数,是小数点后有五位。
2 年多之前 回复
xh931076284
xh931076284 即使存在浮点数精度的问题,sprintf格式化后,小数点后保留5位,也会出现内存访问越界的问题吗?
2 年多之前 回复
91program
91program 在格式化时有 "%.5f" 限制,内存越界应该不会出现。但是数值会发生变化!
2 年多之前 回复
Evankaka
Evankaka   Ds   Rxr 2015.07.18 11:10

浮点数的打印和格式控制是sprintf 的又一大常用功能,浮点数使用格式符”%f”控制,默认保留小数点后6 位数字,比如:

sprintf(s, "%f", 3.1415926); //产生"3.141593"

有时我们希望自己控制打印的宽度和小数位数,这时就应该使用:”%m.nf”格式,其中m 表示打印的宽度,n 表示小数点后的位数。比如:

sprintf(s, "%10.3f", 3.1415626); //产生:" 3.142"

sprintf(s, "%-10.3f", 3.1415626); //产生:"3.142 "

sprintf(s, "%.3f", 3.1415626); //不指定总宽度,产生:"3.142"

CSDNXIAOD
CSDNXIAOD   2015.07.18 11:22

【C语言】将数组作为函数的参数
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

caozhy
caozhy   Ds   Rxr 2015.07.19 07:22

动态分配的数组本身没有问题,但是缓冲区要足够大。

Csdn user default icon
上传中...
上传图片
插入图片