题
问题是静态的分配一个缓冲区足够大,以适应一个印刷双格式与%g在最高精度。这似乎是一个足够简单的任务,卜我有麻烦。好的,我来用(假设的数印刷是x)
char buf[1 + DBL_DIG + DBL_DIG + 1 + 1 + 1 + DBL_DIG + 1];
int len = sprintf(buf, "%.*g", DBL_DIG, x);
该DBL_DIG宏从浮动。h,显然是应该指明的最高精度的类型倍。我们需要:
- 1byte为一个负号
- 足够的字节的捕获效数字
- 至多一个'隔'char(逗号,等等。) 每个数字
- 1字节的一小点
- 1byte为'电子'
- 1字节的标志在指数
- 一些字节的指数
- 1字节的结尾null写的sprintf.
我使用的数量的重大数字作为一个上限数位数的指数。我已经做了任何错误?是有一个更好的解决办法?我是不是应该分配64,128,256bytes和最好的希望?
解决方案 4
而不是使用 sprintf
, 你可以用 asprintf
.这种分配的缓冲区的正确的尺寸适合你的串。
其他提示
你无法预计的大小在编译时间。该%g格式化需要的区域入账户(用于1000的分离器等。) 看看 http://linux.die.net/man/3/sprintf 为说明如何计算的尺寸的安全。
使用 snprintf()
发现多少个角色,你需要:
#include <float.h> /* DBL_DIG */
#include <stdio.h>
#include <stdlib.h>
int main(void) {
double x = rand() / (double)RAND_MAX;
char find_len[1];
int need_len;
char *buf;
need_len = snprintf(find_len, 1, "%.*g", DBL_DIG, x);
buf = malloc(need_len + 1);
if (buf) {
int used = sprintf(buf, "%.*g", DBL_DIG, x);
printf("need: %d; buf:[%s]; used:%d\n", need_len, buf, used);
free(buf);
}
return 0;
}
你需要一个C99编译器 snprintf()
.
snprintf()
定义是通过C99标准。一C89执行情况是不需要 snprintf()
定义,而如果它已经作为一个延伸,它不需要"工作"所描述的C99标准。
两件事情:%g不显示所有的数字表示,%g显示了一个很好的-对-人类圆的结果。你可以指定的精度使用%f或%电子如果你会喜欢不同的结果。
从来没有使用sprintf()而不是使用snprintf().在你的情况:int len = snprintf(buf, dimensionof(buf), "%.*f", DBL_DIG, x);
我是不是应该轮到64,128,或 256和最好的希望?
是的,只是做了-.-
不隶属于 StackOverflow