Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
3 / 3 / 2
Регистрация: 24.03.2020
Сообщений: 153

Парсинг строк

03.05.2020, 22:59. Показов 3592. Ответов 9

Студворк — интернет-сервис помощи студентам
Всем привет, у меня есть задание: выделить из строки каждую координату и поместить в контейнер vector. По завершению парсинга вывести на экран общее количество распарсеных точек и их координаты.

На данном примере вывод должен выглядеть следующим образом:

Количество точек: 5

Координаты:

X Y

192.56 -21.2

17.08 22.8

-0.01 0.02

33.2 43.8

-12.1 14.5

Спасибо заранее. Я, конечно, код писал не сам, а с помощью видео Но вывод идёт лесенкой, как вы уже поняли, я начинающий.
Можете указать на ошибку, или кусок кода привести что-ли, чтобы я понял .

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <iostream>
#include <vector>
#include <string>
using namespace std;
 
void printvec(vector<string> vec)
{
for (auto i : vec)
{
cout << i << endl;
}
}
 
string deleteSpaces(string s)
{
int position;
if (!s.empty())
{
do
{
position = s.find(" ");
if (position != -1) s.erase(position, 1);
} while (position != -1);
if (s[0] == ',') s.erase(0, 1);
if (s[s.length() - 1] == ',') s.erase(s.length() - 1, s.length());
return s;
}
return "";
}
 
vector<string> splitString1(string s)
{
vector<string> vs;
int i = 0;
int l = s.length();
while (i < l)
{
while (s[i] == ',' && i < l) i++;
string r = "";
while (s[i] != ',' && i < l)
{
r = r + s[i];
i++;
}
if (!r.empty()) vs.push_back(r);
}
return vs;
}
 
vector<string> splitString(string s)
{
vector<string> vs;
s = deleteSpaces(s);
int position = 0;
int position1 = -1;
string word;
if (!s.empty())
{
do
{
position = s.find(" ", position);
if (position != -1)
{
word = s.substr(position1 + 1, position - position1-1);
vs.push_back(word);
position1 = position;
position++;
}
else
{
if (position1 == -1) vs.push_back(s);
else
{
word = s.substr(position1 + 1, s.length() - position1);
vs.push_back(word);
}
break;
}
}
while (position != -1);
}
return vs;
}
 
int main()
{
setlocale(LC_ALL, "rus");
vector<string> vs;
string s = "192.56,-21.2,17.08,22.8,-0.01,0.02,33.2,43.8,-12.1,14.5\n";
cout << "Координаты: " << s << endl;
vs = splitString1(s);
printvec(vs);
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.05.2020, 22:59
Ответы с готовыми решениями:

Парсинг строк из файла
Имеется файл с содержанием 3 Text Text2 Text3

Парсинг строк из файла
Добрый вечер, нуждаюсь в помощи, суть такова. Есть файл в нем есть N-е количество строк такого типа как: 192.168.0.1;user;pass и т.д....

Парсинг строк: подсчитать и вывести количество слов в заданной строке
Прочитать из файла строку символов. Данная строка состоит из нулей, единиц и пробелов. Группы нулей и единиц, разделенные пробелами (одним...

9
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
03.05.2020, 23:01
Какой ещё лесенкой? Что ты хочешь получить?
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
03.05.2020, 23:07
Цитата Сообщение от FreeEagle Посмотреть сообщение
код с помощью видео написал
Не лучший способ учиться программировать.
Цитата Сообщение от FreeEagle Посмотреть сообщение
Можете указать на ошибку
В задании речь идет о точках, а у вас точек нет, только числа. Если бы в векторе сохранялись именно координаты точек (парами), то и выводить можно было парами. Тут либо менять цикл вывода, либо делать нормально.

И зачем Вы нам показали функции splitString и deleteSpaces, если они тут не используются?
1
3 / 3 / 2
Регистрация: 24.03.2020
Сообщений: 153
03.05.2020, 23:24  [ТС]
valen10, я понимаю, да, но вывод у меня идёт лесенкой, в смысле координаты идут не парами, а каждую строку новая точка.
Миниатюры
Парсинг строк  
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
03.05.2020, 23:28
FreeEagle, новый код покажите.
0
3 / 3 / 2
Регистрация: 24.03.2020
Сообщений: 153
03.05.2020, 23:35  [ТС]
Изменил только эту часть. Всё остальное оставил.

C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    setlocale(LC_ALL, "rus");
    vector<string> vs;
    string s1 = "192.56,\t\t-21.2,17.08,\t\t22.8,-0.01,\t\t0.02,33.2,\t\t43.8,-12.1,\t\t14.5";
    string s = "192.56,-21.2,17.08,22.8,-0.01,0.02,33.2,43.8,-12.1,14.5\n";
    cout << "Координаты: " << s << endl;
    cout << "  X\n\t\tY\n";
    vs = splitString1(s1);
    printvec(vs);
}
Добавлено через 5 минут
Если так будет проще, пожалуйста, полный код с изменениями.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
#include <vector>
#include <string>
using namespace std;
 
void printvec(vector<string> vec)
{
    for (auto i : vec)
    {
        cout << i << endl;
    }
}
 
string deleteSpaces(string s)
{
    int position;
    if (!s.empty())
    {
        do
        {
            position = s.find(" ");
            if (position != -1) s.erase(position, 1);
        } while (position != -1);
        if (s[0] == ',') s.erase(0, 1);
        if (s[s.length() - 1] == ',') s.erase(s.length() - 1, s.length());
        return s;
    }
    return "";
}
 
vector<string> splitString1(string s)
{
    vector<string> vs;
    int i = 0;
    int l = s.length();
    while (i < l)
    {
        while (s[i] == ',' && i < l) i++;
        string r = "";
        while (s[i] != ',' && i < l)
        {
            r = r + s[i];
            i++;
        }
        if (!r.empty()) vs.push_back(r);
    }
    return vs;
}
 
vector<string> splitString(string s)
{
    vector<string> vs;
    s = deleteSpaces(s);
    int position = 0;
    int position1 = -1;
    string word;
    if (!s.empty())
    {
        do
        {
            position = s.find(" ", position);
            if (position != -1)
            {
                word = s.substr(position1 + 1, position - position1-1);
                vs.push_back(word);
                position1 = position;
                position++;
            }
            else
            {
                if (position1 == -1) vs.push_back(s);
                else
                {
                    word = s.substr(position1 + 1, s.length() - position1);
                    vs.push_back(word);
                }
                break;
            }
        }
        while (position != -1);
    }
    return vs;
}
 
int main()
{
    setlocale(LC_ALL, "rus");
    vector<string> vs;
    string s1 = "192.56,\t\t-21.2,17.08,\t\t22.8,-0.01,\t\t0.02,33.2,\t\t43.8,-12.1,\t\t14.5";
    string s = "192.56,-21.2,17.08,22.8,-0.01,0.02,33.2,43.8,-12.1,14.5\n";
    cout << "Координаты: " << s << endl;
    cout << "  X\n\t\tY\n";
    vs = splitString1(s1);
    printvec(vs);
}
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
03.05.2020, 23:45
FreeEagle, зачем Вы меняете исходные данные? Менять нужно вывод данных, а в идеале и обработку тоже.
Вот шаблон на основе вашего кода, исправьте ошибки, допишите извлечение второй координаты точки и проверку успешности.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <vector>
#include <string>
#include <utility>
using namespace std;
 
using Point = std::pair<std::string,std::string>;
 
void printvec(const vector<Point> &vec)
{
    for (const auto &p : vec)
    {
        cout << p.first << ' ' << p.second << endl;
    }
}
 
vector<Point> parse(const string &s)
{
    vector<Point> vs;
    size_t i = 0;
    const size_t len = s.length();
    while (i < len)
    {
        // Здесь ошибка: сначала нужно проверять конец строки.
        while (s[i] == ',' && i < len) i++;
        string r;// = ""; <- это лишнее, у std::string есть конструктор.
 
        // Здесь ошибка: сначала нужно проверять конец строки.
        while (s[i] != ',' && i < len)
        {
            r = r + s[i];
            i++;
        }
 
        // Здесь каким-то образом нужно сформировать пару.
        // Если получилось, то добавить к вектору.
        Point p;
        p.first = r;
        //p.second = ???
        if (/* ??? */) {
            vs.push_back(p);
        }
    }
    return vs;
}
 
int main()
{
    setlocale(LC_ALL, "rus");
    vector<Point> vs;
    string s = "192.56,-21.2,17.08,22.8,-0.01,0.02,33.2,43.8,-12.1,14.5\n";
    cout << "Координаты: " << s << endl;
    vs = parse(s);
    printvec(vs);
}
2
3 / 3 / 2
Регистрация: 24.03.2020
Сообщений: 153
04.05.2020, 00:07  [ТС]
Спасибо, но что вы описали мне сделать, для меня немного трудно осуществить, давно мне преподаватель написал, что да вывод нужно полностью переписать, и воспользоваться классическим оператором for(int i=0; i<vec.size();i++).
И поэлементно выводить через табуляцию пары, потом перевод строки.
Не могли бы вы мне показать как это дело осуществляется, я пытался добавить, но как построить цикл правильно не понял
Там шли не координаты по столбцам, а цифры по порядку, т.е. 12345 и т.д. Также забыл добавить, что точки идут так: Чётные элементы печатаются под X, а нечётные под Y (так, чтобы понятней было).
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
04.05.2020, 00:52
Лучший ответ Сообщение было отмечено FreeEagle как решение

Решение

Так что-ли?
C++
1
2
3
4
5
6
7
8
9
10
void printvec(vector<string> vec)
{
    for (int i = 0; i < vec.size(); ++i) {
        cout.width(11);
        cout << vec[i];
        if (i % 2) {
            cout << '\n';
        }
    }
}
2
3 / 3 / 2
Регистрация: 24.03.2020
Сообщений: 153
04.05.2020, 01:48  [ТС]
Спасибо большое, всё получилось.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.05.2020, 01:48
Помогаю со студенческими работами здесь

Парсинг строк: выделить из каждой строки первые три числа, разделенные запятой
Есть строки вроде: 192,216,10353,2,0,P|244:184|256:40,1,210,0|2,0:0|0:0,0:0:0:0: ...

Парсинг строк в файле
Здравствуйте, есть файл. INFO: Test1 INFO: Test2 INFO: Test3 DATA: Test2 TEST: Test и т.д

Парсинг строк из текстового файла
Доброго времени суток, господа! Уже n-ое количество времени мучаюсь со следующей задачей: Имеется программа, в которой по нажатию...

Парсинг строк, выделить только IP
Всем привет! Имеется текстовый файл с таким содержанием: Мне необходимо выделить только IP, т.е. Выдёргиваю таким...

Парсинг строк
Вот код, который находит строку с содержимым 'SIM': var s1, s2:string; begin assignfile(f1,'c:\02.txt'); reset(f1); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru