2017-05-09 24 views
-1

我试图接收一串像这样的点(2,4),(5,8),(12,7),(15.54,3.65)并将其分离为X数组和y数组,请帮助我仍试图这样的初学者,这是灾难性的将字符串分隔为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

建议整理括号并提供[mcve] – user4581301

+0

推荐:打破工作。 [使用'std :: string :: find'](http://en.cppreference.com/w/cpp/string/basic_string/find)来帮助找到'('和')'然后打印出来它们之间。一旦你有了这个工作,用['std :: stringstream'](http://en.cppreference.com/w/cpp/io/basic_stringstream)和'std :: getline'替换打印出来的代码来分割成过去在括号之间的数字并打印数字。当这一切都正常工作,你有一个号码对流,找到一个好方法来存储对。 – user4581301

+0

谢谢你,我会试试这个 – Antonio

回答

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> 
+0

谢谢你的时间这是优雅 – Antonio

+0

@Antonio,如果你认为这个答案解决了你的问题,请点击勾号接受它。欢呼声 – CroCo

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

希望它有帮助。

+0

谢谢你,感谢你的时间,这正是我所期待的 – Antonio

相关问题