Достать координаты из строки
Нужно сделать программу достающую координаты вида (x,y) из строки, вроде как написал, но почему то достается только одна точка, первая, не понимаю в чем ошибка.
void main() {
string pointstr;
Point pointn;
vector<Point> points;
cout << "Enter coords: ";
cin >> pointstr;
size_t start = pointstr.find('(');
size_t comma = pointstr.find(',');
size_t end = pointstr.find(')');
while (start != string::npos && comma != string::npos && end != string::npos) {
pointn.x = stod(pointstr.substr(pointstr.find("(") + 1, pointstr.find(",") - 1));
pointn.y = stod(pointstr.substr(pointstr.find(",") + 1, pointstr.find(")") - 1));
pointstr.erase(pointstr.find("("), pointstr.find(")") + 1);
points.push_back(pointn);
start = pointstr.find('(');
comma = pointstr.find(',');
end = pointstr.find(')');
}
for (vector<Point>::iterator it = points.begin(); it < points.end(); it++) {
cout << it->x << " " << it->y << endl;
}
system("pause");
}
Ответы (1 шт):
Автор решения: KoVadim
→ Ссылка
У нас же с++? так давайте писать на с++!
#include <iostream>
#include <sstream>
#include <vector>
// это структура для точки
struct Point
{
int x;
int y;
};
// определим оператор ввода с потока
// собственно, это основная часть вопроса
// в коде делаем небольшие проверки, что у нас все в порядке
std::istream& operator>>(std::istream& is, Point & p)
{
char c;
is >> c;
if (c != '(') {
is.setstate(std::ios_base::failbit);
return is;
}
is >> p.x;
is >> c;
if (c != ',') {
is.setstate(std::ios_base::failbit);
return is;
}
is >> p.y;
is >> c;
if (c != ')') {
is.setstate(std::ios_base::failbit);
return is;
}
return is;
}
// ну как же без оператора вывода!
std::ostream& operator<<(std::ostream& os, const Point& p)
{
os << '(' << p.x << ", " << p.y << ')';
return os;
}
// пример использования
int main()
{
std::stringstream s{"(1,2) (2,3)"};
Point p;
std::vector<Point> points;
while (s >> p) {
points.push_back(p);
}
for (auto& p:points) {
std::cout << p << "\n";
}
}
Но теперь можно писать даже так
Point p;
std::cin >> p;
std::cout << p;
и все будет работать "Из коробки". Точно также можно даже в файл выводить