将std::string转换为具有负值的双精度会导致零或引发异常

  • 本文关键字:异常 双精度 转换 string std c++
  • 更新时间 :
  • 英文 :


上下文

从输入文件中读取数字作为std::string并将其转换为double

我的解决方案

根据我在网上能找到的内容,我尝试了各种方法:

std::string str = "­‐12.5799";
std::cout << str << std::endl;
double d;
std::stringstream(str) >> d;
std::cout << d << std::endl;
std::cout << atof(str.c_str()) << std::endl;
std::cout << stod(str) << std::endl;

问题

当从文件中读取正数时,它似乎工作得很好,但当出现符号"时,会导致奇怪的错误和异常-"在CCD_ 3。

输出:

‐12.5799
0
0
stod

我显然错过了什么?

这不是一个普通的ASCII连字符/减号字符。

相反,它是以下代码点序列:

  • U+00AD:SOFT HYPHEN[SHY]{任意连字符}
  • U+2010:连字符

因此,您的解析尝试失败。

如果有疑问,请将文本复制/粘贴到十六进制编辑器或在线工具中,如https://babelstone.co.uk/Unicode/whatisit.html.

如果遇到连字符(伴随着无数视觉上相似但不同的字符(等字符的神秘问题,请始终将此视为调试步骤。

所谓的";"聪明";引号是另一个很好的例子,说明人物远没有他们声称的那么无辜。

最新更新