将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)