Чтение значений одной строки по шаблону другой

235
15 февраля 2018, 15:43

Пытаюсь сделать следующее: Читаем строку шаблон str2 (которая со звездочками) Если находим * , то читаем значение из str1 в соотсветствующей позиции если находим & в str2 то обработка строки прекращается.

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
     bool flag = false;
     int start_pos_2 {};
     int start_pos_1 {};
     int counter {};
     int tag_counter {};
     int next_position_1 {};
     std::string make_string {};
     std::string final_string {};
     std::string str1("<tr> <th>Test_Value</th> <th>56</th> </tr><tr> <th>Test_Value_2</th> <th>45</th> </tr>");
     std::string str2("<tr> <th>*</th> <th>*</th> </tr><tr> <th>*</th> <th>*</th> </tr>");
     size_t I = str2.find("*");
     tag_counter = std::count(str2.begin(), str2.begin() + I, '>');
     for (; start_pos_1 <= str1.length(), start_pos_2 <= str2.length(); start_pos_1++, start_pos_2++)
     {
           if (counter != tag_counter)
           {
                   if (str1[start_pos_1] == '>')
                   {
                           counter++;
                   } else
                           continue;
           }else
           {
                   if (flag == false)
                   {
                           next_position_1 = start_pos_1;
                           while (str1[next_position_1] != '<')
                           {
                                   make_string += str1[next_position_1];
                                   next_position_1++;
                           }
                           flag = true;
                           make_string += ',';
                           final_string += make_string;
                   } else
                           continue;
           }
     }
    cout << final_string << endl;
    return 0;
}

Вопрос: сейчас программа находит только первую * и читает значение с тойже позиции из другой строки. Как продолжить поиск других * в строке, а также прекратить при нахождении &?

Answer 1

Позволил себе немного вольности в рамках вашей задачи, как я понял, вам нужно считать все значения внутри тегов по какому-то шаблону(правда, через regex, думаю, было бы проще, или скорее всего есть какой-нибудь reader для этих целей, ну да ладно):

int main()
{
    std::string make_string{};
    std::string final_string{};
    std::string str1("<tr> <th>Test_Value</th> <th>564</th> </tr><tr> <th>Test_Value2</th> <th>456</th> </tr><tr> <th>Test_Value3</th> <th>123</th> </tr>"); 
    std::string str2("<tr> <th>*</th> <th>*</th> </tr><tr> <th>*</th> <th>*</th> </tr><tr> <th>*</th> <th>*</th> </tr>");
    size_t i = 0;
    i = str2.find("*", i);
    int position = i;
    auto count = 0;
    while (true)
    {
        while (str1[position] != '<')
        {
            make_string += str1[position];
            position++;
        }
        i = str2.find("*", i + 1);
        if (i > str1.length())
            break;
        final_string += make_string + ',';
        make_string = "";
        count += 2;
        position = i + (final_string.length() - count);
    }
    final_string += make_string;
    cout << final_string << endl;
    return 0;
}
READ ALSO
Серверная часть для c++ [требует правки]

Серверная часть для c++ [требует правки]

Что использовать в качестве общения с бд?Что-то по типу вебсокетов в nodejs также было бы неплохо

203
Резервирование памяти в std::vector

Резервирование памяти в std::vector

Хочу реализовать свой вектор для лучшего понимания работы данного контейнераМожете объяснить за счет чего происходит "резервирование" памяти...

246
Visual Studio 15 выдает ошибку, которой нет

Visual Studio 15 выдает ошибку, которой нет

Я установил движок cocos2d-x-316 на VS15

220