首页 > 解决方案 > 用括号解析 C++ 中的字符串

问题描述

我必须在 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;

标签: c++

解决方案


使用输入流,您需要读取变量的输入。您可以使用 . 读入 achar或字符串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读取内容的逻辑,或者通过基于前一个匹配结束位置的正则表达式循环(而不是一次匹配整个字符串),尽管事情变得更加先进。


推荐阅读