簡體   English   中英

用括號解析C ++中的字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM