如何从 C++ 中的输入中获取特定数字?

How do I get a specific number from an input in c++?

有 N 个有序对的列表,形式为 (A,B)

示例输入:

(200,500)
(300,100)
(300,100)
(450,150)
(520,480)

我只想从输入中获取数字,以便我可以在我的 Point 结构中使用它们,并使用它们来表示坐标平面上的位置。

这是我的代码:

#include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <map>
#include <fstream>
using namespace std;

struct Punto
{
    double x,y;
    double distancia;
    double zona;
};

int main()
{
    int n=4;
    Punto arr[n];

    int x, y;
    for(int i=0; i<n; i++){
      cin.ignore(); //(
      std::cin >> x;
      arr[i].x = x;
      std::cout << "Punto " << i << " x " << x << '\n';
      cin.ignore(); //,
      std::cin >> y;
      arr[i].y = y;
      std::cout << "Punto " << i << " y " << y << '\n';
      cin.ignore(); //)
    }


    return 0;
  }

问题是这仅适用于第一个条目,但不适用于以下条目。

ignore 除了要忽略的字符外,还将丢弃换行符,这意味着在循环的第二次迭代中 cin.ignore() 将忽略离开开头的换行符( 仍在流中并导致 std::cin >> x 失败。

更可靠的方法是读取分隔符并检查它们的值,这将有助于检测文件格式中的错误或代码中的错误,并且还有一个额外的好处,即读取字符会自动跳过包括新行在内的空白。

boll readDelim(char expected)
{
    char ch;
    std::cin >> ch;
    return ch == expected;
}

int main()
{
    const int n=4;
    Punto arr[n];

    int x, y;
    for(int i=0; i<n; i++){
      if (!readDelim('(')) break;
      std::cin >> x;
      arr[i].x = x;
      std::cout << "Punto " << i << " x " << x << '\n';
      if (!readDelim(',')) break;
      std::cin >> y;
      arr[i].y = y;
      std::cout << "Punto " << i << " y " << y << '\n';
      if (!readDelim(')')) break;
    }


    return 0;
  }