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

语境

从输入文件中读取一个数字作为 astd::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;

问题

当从文件中读取正数时,它似乎工作得很好,但是当std::string.

输出:

?12.5799
0
0
stod

我显然错过了什么?

回答

那不是普通的 ASCII 连字符/减号字符。

它是以下代码点序列:

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

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

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

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

所谓的“聪明”引用是另一个很好的例子,说明角色远没有他们声称的那么无辜。

  • It's U+2010, actually. Everybody needs a better text editor 🙂
  • The way this year's turned out you'd think it was U+2020.
  • @HansPassant There's not much to tell; I literally just [only read one line of output](https://i.stack.imgur.com/0TL6N.png)

以上是将std::string转换为具有负值的double会导致零或引发异常的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>