问题是静态的分配一个缓冲区足够大,以适应一个印刷双格式与%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和最好的希望?

是的,只是做了-.-

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top