我想编写一个将float转换为const char *的c ++函数。在此函数中,传递一个参数以指定输出值应表示的小数位。我已经提出了这个功能,并且效果很好。
我想是否有更好的方法来编写这个函数?。
static const char* getString(float value, int decimalPlaces)
{
char strValue[sizeof value];
sprintf(strValue, "%.%df", value, decimalPlaces);
return strValue;
}
答案 0 :(得分:6)
您的功能有两个主要问题。
首先,float
的大小在大多数平台的四个字节上,这意味着你的数组只有四个元素。对于浮点值的所有数字都不够。写出界限将导致未定义的行为。
第二个问题是你返回一个指向局部变量的指针。一旦函数返回,数组strValue
将超出范围,指针现在将成为所谓的迷路指针。取消引用它也会导致未定义的行为。
简而言之,您的功能不“工作得很好”。它根本不起作用。
显而易见的解决方案是使用std::string
和std::to_string
将浮点值转换为字符串。然后当你需要一个C风格的以null结尾的字符串(无论出于何种原因)时,你使用字符串c_str()
成员函数来获得这样的指针。
如果您需要特定的小数位数,请使用std::ostringstream
和标准I/O manipulators按照您希望的方式格式化字符串。如果您的目标是获取输出字符串,您当然可以跳过此步骤,并在编写输出时直接使用操纵器。
答案 1 :(得分:2)
当你return strValue;
时,你将返回一个指向局部变量的指针。这意味着当函数结束时变量消失,现在你有一个指向什么的指针。使用该指针是未定义的行为。
您要么必须使用new[]
来分配缓冲区,然后您需要记住delete[]
呼叫站点中的指针或使用类似std::string
的内容并让字符串本身处理内存管理。
就个人而言,我会使用std::string
和std::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