在小数点后设置浮点数

时间:2016-11-28 15:39:39

标签: c++ c++11

我想编写一个将float转换为const char *的c ++函数。在此函数中,传递一个参数以指定输出值应表示的小数位。我已经提出了这个功能,并且效果很好。

我想是否有更好的方法来编写这个函数?。

static const char* getString(float value, int decimalPlaces)
{
     char strValue[sizeof value];
     sprintf(strValue, "%.%df", value, decimalPlaces);
     return strValue;
}

3 个答案:

答案 0 :(得分:6)

您的功能有两个主要问题。

首先,float的大小在大多数平台的四个字节上,这意味着你的数组只有四个元素。对于浮点值的所有数字都不够。写出界限将导致未定义的行为

第二个问题是你返回一个指向局部变量的指针。一旦函数返回,数组strValue将超出范围,指针现在将成为所谓的迷路指针。取消引用它也会导致未定义的行为。

简而言之,您的功能“工作得很好”。它根本不起作用。

显而易见的解决方案是使用std::stringstd::to_string将浮点值转换为字符串。然后当你需要一个C风格的以null结尾的字符串(无论出于何种原因)时,你使用字符串c_str()成员函数来获得这样的指针。

如果您需要特定的小数位数,请使用std::ostringstream和标准I/O manipulators按照您希望的方式格式化字符串。如果您的目标是获取输出字符串,您当然可以跳过此步骤,并在编写输出时直接使用操纵器。

答案 1 :(得分:2)

当你return strValue;时,你将返回一个指向局部变量的指针。这意味着当函数结束时变量消失,现在你有一个指向什么的指针。使用该指针是未定义的行为。

您要么必须使用new[]来分配缓冲区,然后您需要记住delete[]呼叫站点中的指针或使用类似std::string的内容并让字符串本身处理内存管理。

就个人而言,我会使用std::stringstd::stringstream之类的:

static std::string getMString(float value, int decimalPlaces)
{
    std::stringstream stream;
    stream << std::fixed << std::setprecision(decimalPlaces) << value;
    return stream.str();
}

答案 2 :(得分:2)

您的功能存在问题,因为一旦您离开char strValue[]并且您返回指向已删除数据的指针,{@ 1}}就会被删除,这就是UB。

我建议不要发明任何内容,但请使用C ++ 11 getMString