我必须在C ++中解析字符串以获取双精度。 字符串的格式类似于[(a,b)-(c,d)],其中a,b,c和d将是双精度变量。
我试图使用stringstrem,但是它不接受const char参数,所以我现在不知道如何解决它。
我现在的代码如下:
ss >> "[(" >> a >> "," >> b >> ")-(" >> c >> "," >> d >> ")]";
可惜的是它不起作用:(
例如:[(1.2,3.4)-(6.5,7.4)]。 我想要:
a=1.2;
b=3.4;
c=6.5;
d=7.4;
答案 0 :(得分:6)
对于输入流,您需要读取输入到变量。您可以读入char
或读入std::istream::read
的字符串。理想情况下,您应该检查字符是否确实符合预期,以捕获并可能拒绝说出__1.2-3.4@#~6.5,7.8++
char chr;
ss >> chr >> chr >> a >> chr >> b >> chr >> chr >> chr >> c >> chr >> d >> chr >> chr;
或者,您可以将其读取为字符串,然后可以使用C ++ <regex>
功能对其进行匹配,例如:
^\[\((\d+\.\d+),(\d+\.\d+)\)-\((\d+\.\d+),(\d+\.\d+)\)\]$
这将为您提供4个成功的捕获组,然后您可以将其转换为双打。例如,如果允许多余的空格,小数点是可选的,等等,您可以进行修改。
如果格式有任何变化,例如有时您会得到3个数字,例如[(1.2,3.4)-(6.5,7.4)+(1.5,2)]
比>>
操作员可以直接支持的深度解析更多。
可能可以使用基于ss >> chr
所读内容的逻辑,或者通过根据上一个匹配项的结束位置(而不是一次匹配整个字符串)循环查找正则表达式,尽管事情会变得更加先进。
答案 1 :(得分:1)
这并不是解决问题的最优雅的方法,但它是人类可以阅读和维护并可能在以后轻松扩展的一种方法...我宁愿使用它而不是正则表达式:-)
auto input = "[(1.0,2.0)-(3.0,444.555)]";
std::string in(input);
for (auto iter = in.begin(); iter < in.end(); iter++)
{
char c = *iter;
// If c == '(' or ',' parse a double number (digits or '.')
// and save it somewhere.
// else: stop parsing a number / continue
}
答案 2 :(得分:1)
老实说,这是C库仍然拥有最佳工作工具的时候之一:
columns.push({
xtype: 'actioncolumn',
width: 35,
dataIndex: 'objType',
renderer: function (value, rowIndex, record) {
if (value == 'object') {
rowIndex.tdCls = 'icon'
}
else{
rowIndex.tdCls = 'img'
}
},
items: [{
tooltip: t('icon_compare_version'),
icon: "/bundles/pimcoreadmin/img/flat-color-icons/info.svg",
handler: this.compareVersion.bind(this),
iconCls: 'compare-v'
},
{
tooltip: t('icon_compare_image_version'),
id:'compare-i',
icon: "/bundles/pimcoreadmin/img/flat-color-icons/picture.svg",
handler: this.compareImageVersion.bind(this),
iconCls: 'compare-i'
}]
});
IOStreams可以做到(如Fire Lancer所示),但是稍稍冗长,并且您可以自己滚动(如Ozzy所示),但是为什么要花那么多精力呢?
还有大量的 Boost.Spirit 怪兽可以以“现代”方式实现这一目标,而获得的收益却很小。
这真的是一站式解决的问题。