[英]Parsing string in C++ with brackets
我必須在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;
使用輸入流,您需要讀取變量的輸入。 您可以使用std::istream::read
讀入char
或字符串。 理想情況下你會檢查字符是否符合預期,捕獲並可能拒絕說__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
讀取的邏輯,或者基於前一個匹配結束的位置循環正則表達式(而不是一次匹配整個字符串),盡管事情變得更加先進。
它肯定不是解決它的最優雅的方式,但它是一種人類可以閱讀和維護的方式,並可能在以后輕松擴展......我更喜歡這種方式而不是正則表達式:-)
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
}
老實說,這是C庫仍然擁有最佳工具的時代之一:
#include <cstdio>
#include <string>
#include <iostream>
int main()
{
const std::string input = "[(1.2,3.4)-(6.5,7.4)]";
double a, b, c, d;
if (std::sscanf(input.c_str(), "[(%lf,%lf)-(%lf,%lf)]", &a, &b, &c, &d) == 4)
{
std::cout << "a=" << a << '\n';
std::cout << "b=" << b << '\n';
std::cout << "c=" << c << '\n';
std::cout << "d=" << d << '\n';
}
else
{
std::cout << "Did not parse!\n";
}
}
// Output:
//
// a=1.2
// b=3.4
// c=6.5
// d=7.4
IOStreams可以做到這一點(正如Fire Lancer所展示的那樣),但是在冗長的情況下 ,你可以自己滾動它(如Ozzy所示),但為什么要這樣做呢?
還有巨大的Boost.Spirit怪物可以以“現代”的方式做到這一點,獲得的收益很少。
真的,這是一個單行解決的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.