【问题标题】:separation of string into arrays of x and y将字符串分离为 x 和 y 数组
【发布时间】:2017-05-09 00:33:06
【问题描述】:

我正在尝试接收这样的一串点 (2,4),(5,8),(12,7),(15.54,3.65) 并将其分成 x 数组和 y 数组请帮助仍然初学者我试过这个,这是灾难性的

string polygons;
int i = 0;
int length = polygons.length();
string x[10000];
int index = 0;
int k = 0;
getline(cin, polygons);

for (i = 0; i < length; i++) 
{
    if (polygons[i] == '(') 
    {
        k = polygons.substr(i + 1, 20).find_first_of(",");

        x[index] = polygons.substr(i + 1, ((k + i) - (i + 1)));
        index++;
    }
}

int a = 0;  
string y[10000]; 
int index2 = 0;
int c = 0;

for (a = 0; a < length; a++) 
{
    if (polygons.substr(a) == ",") 
    {
        c = polygons.substr(a + 1, 20).find_first_of(")");
    }

    y[index2] = polygons.substr(a + 1, ((c + a) - (a + 1)));
    index2++;
}

【问题讨论】:

  • 建议整理括号并提供minimal reproducible example
  • 建议:分解工作。 Use std::string::find 帮助找到 '(' 和 ')' 然后打印出它们之间的东西。一旦你有这个工作,用std::stringstreamstd::getline替换打印出来的代码,拆分成括号之间的数字并打印数字。当一切正常并且你有一个数字对流时,找到一种存储这些对的好方法。
  • 您应该在 C++ 中对数组使用 std::vector

标签: c++ arrays string point


【解决方案1】:

要将点从一个字符串转换为具有数值的点,您可以使用.find_first_of()std::stod()。这是我将点字符串转换为数值的代码。

#include <string>
#include <iostream>
#include <vector>

using std::string;
using std::vector;
using std::cout;
using std::endl;

class Point
{
public:
    Point(double x= 0, double y= 0) : m_x(x), m_y(y) {}
    inline double getX() const { return m_x; }
    inline double getY() const { return m_y; }
private:
    double m_x, m_y;
};

vector<Point> strPoints2NumPoints(const string& strPoints)
{
    vector<Point> points;

    for (int i(0); i < strPoints.size(); ++i){

        if ( strPoints[i] == '(' ){
            // extract X & Y values as string
            string temp = strPoints.substr(i+1, strPoints.find_first_of(")",i)-i-1 );
            // convert X as strig to double 
            double X = std::stod(  temp.substr(0,temp.find(',')) );
            // convert Y as string to double
            double Y = std::stod(  temp.substr(temp.find(',')+1) );
            points.push_back(Point(X,Y));
         }
    }

    return points;
}


int main(int argc, char* argv[])
{
    string strPoints("(2,4),(5,8),(12,7),(15.54,3.65)");
    vector<Point> numPoints;

    cout << "Points as string: " << strPoints << endl;

    numPoints = strPoints2NumPoints(strPoints);

    cout << "Points as numbers: " << endl;
    for(int i(0); i < numPoints.size(); ++i ){
        cout << "Point:<" << numPoints[i].getX() << "," << numPoints[i].getY() << ">" << endl;
    }


    return 0;
}

前面代码的输出是

Points as string: (2,4),(5,8),(12,7),(15.54,3.65)
Points as numbers:
Point:<2,4>
Point:<5,8>
Point:<12,7>
Point:<15.54,3.65>

【讨论】:

  • @Antonio,如果您认为这个答案解决了您的问题,请点击复选标记接受它。干杯
【解决方案2】:

根据您的代码和逻辑,我已经编辑了代码并处理了错误:

string polygons;
int i = 0;
string x[10000];
int index = 0;
int k = 0;
getline(cin, polygons);
int length = polygons.length();

for (i = 0; i < length; i++)
{
    if (polygons[i] == '(')
    {
        // k = polygons.substr(i + 1, 20).find_first_of(",");
        k = polygons.find_first_of(",", i);

        // x[index] = polygons.substr(i + 1, ((k + i) - (i + 1)));
        x[index] = polygons.substr(i + 1, k - i - 1);
        index++;
    }
}

int a = 0;
string y[10000];
int index2 = 0;
int c = 0;

for (a = 0; a < length; a++)
{
    /*
    if (polygons.substr(a) == ",")
    {
        c = polygons.substr(a + 1, 20).find_first_of(")");
    }

    y[index2] = polygons.substr(a + 1, ((c + a) - (a + 1)));
    index2++;
    */
    if (polygons[a] == ',' && polygons[a + 1] != '(')
    {
        k = polygons.find_first_of(")", a);
        y[index2] = polygons.substr(a + 1, k - a - 1);
        index2++;
    }
}

这是我的代码,只是改进和简化你的代码风格:

#include <iostream>
#include <string>
#include <vector>

int main()
{
    std::string Polygons;
    getline(std::cin, Polygons);

    std::vector<std::string> XCoords;
    for (int i = 0; i < Polygons.length(); ++i)
    {
        if (Polygons[i] == '(')
        {
            auto CommaIndex = Polygons.find_first_of(",", i);

            XCoords.push_back(Polygons.substr(i + 1, CommaIndex - i - 1));
        }
    }

    std::vector<std::string> YCoords;
    for (int i = 0; i < Polygons.length(); ++i)
    {
        if (Polygons[i] == ',' && Polygons[i + 1] != '(')
        {
            auto Index = Polygons.find_first_of(")", i);

            YCoords.push_back(Polygons.substr(i + 1, Index - i - 1));
        }
    }

    return 0;
}

希望对你有帮助。

【讨论】:

  • 谢谢你,感谢你的时间,这正是我正在寻找的时间
猜你喜欢
  • 2020-12-13
  • 2021-10-22
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 2012-02-22
相关资源
最近更新 更多