1

我有一个包含许多不同字符的字符串,类似于:“$:”“213.23453”我如何提取双精度值 213.23453 并将其存储在一个变量中,它是 C++/C,我不能使用 lambda。

4

3 回答 3

2

您可以使用函数的“穷人正则表达式”sscanf跳过第一个数字之前的字符,然后读取双精度,如下所示:

char *str = "\"$: \" \"213.23453\"";
double d;
sscanf(str, "%*[^0-9]%lf", &d);

注意第一个百分比格式后面的星号:它指示sscanf读取字符串而不将其内容写入输出缓冲区。

这是关于 ideone 的演示

于 2013-03-19T11:55:27.380 回答
0

使用正则表达式。

[$]?[0-9]*(\.)?[0-9]?[0-9]?

这应该与带有 $ 符号和没有 $ 符号的那些相匹配。

Boost.Regex是一个非常好的正则表达式库

就个人而言,我发现Boost.Xpressive更好用。它是一个仅包含头文件的库,并且具有一些不错的功能,例如静态正则表达式(在编译时编译的正则表达式)。

如果您使用的是符合 C++11 的编译器,请使用std::regex,除非您有充分的理由使用其他东西。

于 2013-03-19T11:46:32.440 回答
0

纯 C++ 解决方案可能是手动切断数字前面的垃圾字符(由 标识的第一个数字std::isdigit),然后构造一个临时istringstream对象来检索double来自:

std::string myStr("$:. :$$#&*$ :213.23453$:#$;");

// find the first digit:
int startPos = 0;
for (; startPos < myStr.size(); ++startPos)
    if (std::isdigit(myStr[startPos])) break;

// cut off the trash:
myStr = myStr.substr(startPos, myStr.size() - startPos);

// retrieve the value:
double d;
std::istringstream(myStr) >> d;

但是指定适当格式的 C 样式sscanf在这里也足够了:)

于 2013-03-19T12:00:05.137 回答