【问题标题】:_fcvt_s converting 0 value to string_fcvt_s 将 0 值转换为字符串
【发布时间】:2021-09-14 04:00:48
【问题描述】:

在一个旧的 C++ 项目中挖掘错误时,我遇到了一个(对我而言)奇怪的 _fcvt 行为 将double转换为字符串的函数

int decPos, isNeg;
char buffer[100];

_fcvt_s(buffer, sizeof(buffer), 0.0000, 2, &decPos, &isNeg);  // buffer == "00"
_fcvt_s(buffer, sizeof(buffer), 1.0000, 2, &decPos, &isNeg);  // buffer == "100"

我希望 _fcvt 的第一次调用会用“000”而不是“00”填充缓冲区。

这导致了我正在寻找的错误。
这是 _fcvt 中的错误(例如,由操作系统或区域设置引起)还是设计使然?
我正在使用最新的 Windows 10 和 VS2019

通过省略该函数,解决方法很简单:

double val = 0.0;
int numDec = 2;

std::ostringstream sout;
sout << std::setprecision(numDec) << std::fixed << val;
string test = sout.str();  //0.00

【问题讨论】:

  • 在阅读了documentation 之后,这种行为对我来说是有意义的,即使我从未使用过该功能并且可能永远不会使用。我猜decPos 第一行是 0,第二行是 1。

标签: c++ converters


【解决方案1】:

根据手册,行为是正确的。

零或负整数值表示小数点位于第一位数字的左侧。

检查decPos 中的小数位。如果它是 0,那么你会得到 .00,它是缓冲区中正确的 00。

【讨论】:

    猜你喜欢
    • 2023-01-11
    • 1970-01-01
    • 2022-11-29
    • 2014-08-10
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多