Не могу завершить алгоритм извлечения координат из строки
Есть задача, частью которой является извлечение координат вида (x,y) из строки, уточню что x и y могут быть числами с плавающей точкой. Способ нахождения самих координат и добавления в вектор сделал, но столкнулся с такой проблемой, что после добавления точки в вектор, необходимо убрать часть строки с этой координатой чтобы найти следующую, проблема в том что у меня не получается определить кол-во символов которые необходимо удалить в методе erase, много чего перепробовал, но ни к чему рациональному так и не пришел. Прилагаю кусок кода
vector <point> points;
point pointn;
string pointstr;
cout << "Введите координаты точек в виде (x,y)" << endl;
cin >> pointstr;
int flag = 0;
while (pointstr.find("(") != string::npos && pointstr.find(",") != string::npos && pointstr.find(")") != string::npos)
{
int count = 0;
pointn.x = stod(pointstr.substr(pointstr.find("(") + 1, pointstr.find(",") - 1));
pointn.y = stod(pointstr.substr(pointstr.find(",") + 1, pointstr.find(")") - 1));
points.push_back(pointn);
pointstr.erase(pointstr.find("("), count);
}
Ответы (1 шт):
Вы знаете, что начинаются координаты точки с
(и до)так, что вам не нужно считать сколько там символов.Вот пример:
pointstr.erase(pointstr.find("("), pointstr.find(")") + 1);+1 потому что удаление идет без учета последнего символа.
Зачем удалять? Можно просто дальше производить поиск, т.к. в функции
findесть второй аргумент, начало поиска.size_t find (char c, size_t pos = 0)И да вы производите поиск по одному символу, так что лучше использовать не двойные кавычки, а ординарные.
//Позиция ( size_t start = pointstr.find('('); //Позиция , size_t comma = pointstr.find(','); //Позиция ) size_t end = pointstr.find(')'); //Переведем в си строку для использования atof const char* pointstr_ = pointstr.c_str(); while (start != string::npos && comma != string::npos && end != string::npos) { pointn.x = atof(pointstr_ + start + 1); pointn.y = atof(pointstr_ + comma + 1); points.push_back(pointn); start = pointstr.find('(', end + 1); comma = pointstr.find(',', start); end = pointstr.find(')', comma); }atof - это аналог функции
atodтолько для си строк, и работает немного удобней чемatodт.к. не придется обрезать строку.