c ++如何从具有反斜杠的字符串中提取数字?

Posted

技术标签:

【中文标题】c ++如何从具有反斜杠的字符串中提取数字?【英文标题】:c++ How to extract numbers from a string that has backslash? 【发布时间】:2016-01-12 23:20:45 【问题描述】:

我正在尝试从字符串中提取数字。 我想将每个数字保存到一个单独的双变量中。 我目前尝试使用这样的简单字符串流。

std::string line = "100.2456426246\200.2624362436\300.136213477347";
std::stringstream stream(line);
stream.precision(20);
double a,b,c;
stream >> a >> b >> c;

不仅精度错误(只打印出6位数字),它只提取第一个数字a(100.245),并且b和c为空。我怀疑这是由于反斜杠造成的,但我不确定。

读取每个数字之间包含反斜杠的字符串并以正确的精度存储整数的最佳方法是什么?

【问题讨论】:

它怎么可能知道你想用斜杠分割你的字符串? 对于“只有 6 位数字”:What Every Computer Scientist Should Know About Floating-Point Arithmetic 字符串"100.2456426246\200.2624362436\300.136213477347" 不包含任何反斜杠!但它确实包含一些不寻常的非 ASCII 字符。 首先您需要转义字符串文字中的反斜杠 - "100.2222\\2000.2000\\300.333" @Drop 如果我的数学运算正确,double 应该在 100 附近的小数点后有 13 位精度。 【参考方案1】:

您可以使用带有分隔符的getline 将字符串拆分为元素向量,并使用atof 沿这些行提取浮点数

vector<string> elems;
stringstream stream(line);
string item;
while (getline(stream, item, "\\")) 
  elems.push_back(item);

vector<float> val(elems.size());
...
val[i]=atof(elems[i].c_str())

这里的精确度更多的是呈现问题,您可以在setprecision 的帮助下进行自定义。例如,

#include <iomanip>
... 
cerr << setprecision(6) << val[i] << endl;

将截断输出到六位有效数字。

另一件事是确保存储直到最后一位的所有数字。为了确保存储所有数字,您定义的浮点数的大小必须足够大以包含您的数据,如果浮点数应替换为 double 或其他内容,则可能需要用适当的解析器替换 atof .

【讨论】:

非常感谢它对我的帮助很大!

以上是关于c ++如何从具有反斜杠的字符串中提取数字?的主要内容,如果未能解决你的问题,请参考以下文章

Java 属性反斜杠

如何从Stroustrup的C ++书中解释此RegEx?

如何转义 NSPredicate 格式字符串中的尾部反斜杠

点液体如何转义反斜杠

在R中有效地将反斜杠转换为正斜杠

如何在字符串中使用反斜杠 (\)?