将字符串分成x和y的数组

时间:2017-05-09 00:33:07

标签: c++ arrays string point

我正在尝试接收一串像这样的点(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++;
}

2 个答案:

答案 0 :(得分:0)

要将点从一个字符串转换为具有数值的点,您可以使用.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>

答案 1 :(得分:0)

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

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;
}

希望它有用。