代码之家  ›  专栏  ›  技术社区  ›  John Millikin

如何使用C的sprintf()安全地格式化float/doubles?

  •  4
  • John Millikin  · 技术社区  · 15 年前

    我把我的一个C++库移植到一个有点笨拙的编译器上——它不支持StrugFipe,也不支持C99特性。 snprintf() . 我需要格式化 int , float ,etc值为 char* ,唯一可用的选项似乎是1)使用 sprintf() 2) 手卷格式化程序。

    或者,是否有一个小型(首选100-200行)的便携式实现 snprintf() 我可以和我的图书馆打包吗?

    理想情况下,我会以 snprintf()

    static const size_t FLOAT_BUFFER_SIZE = /* calculate max buffer somehow */;
    
    char *fmt_double(double x)
    {
        char *buf = new char[FLOAT_BUFFER_SIZE + 1];
        sprintf(buf, "%f", x);
        return buf;
    }
    

    相关问题:

    2 回复  |  直到 9 年前
        1
  •  3
  •   please delete me please delete me    15 年前

    编译器是否支持 ecvt fcvt gcvt ? 它们有点怪异,很难使用,但它们有自己的缓冲区( , fcvt公司 gcvt公司 将产生。你可以从那里拿走。

    char *fmt_double(double d) {
        static char buf[500];
        sprintf(buf,"%f",d);
        assert(buf[sizeof buf-1]==0);//if this fails, increase buffer size!
        return strdup(buf);
    }
    

    这并不能提供任何惊人的保证,但它应该是相当安全的(tm)。不幸的是,我认为这和这种方法一样好。但是如果你习惯于定期运行调试版本,你至少应该得到任何问题的早期警告。。。

        2
  •  1
  •   Martin Broadhurst    15 年前

    我想 GNU Libiberty 是你想要的。您可以只包括snprintf的实现。

    vasprintf.c