Перенос кода из C++ в C (СИ)

222
28 февраля 2018, 09:25

Пытаюсь переписать этот код, написанный на C++ в C (СИ) Код делает следующее: читает str2 если находит * читает str1 от позиции * до ближайшей < потом прибавляет ,

Результат: Test_Value,564,Test_Value2,456,Test_Value3,123,

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

Переделал вот так для СИ.

#include <stdio.h>
#include <string.h>
int main(void)
{
        char *make_string = NULL;
        char *final_string = NULL;
        char *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>";
        char *str2 = "<tr> <th>*</th> <th>*</th> </tr><tr> <th>*</th> <th>*</th> </tr><tr> <th>*</th> <th>*</th> </tr>";
        size_t i = 0;
        char *ptr = strchr(str2, '*');
        i = ptr - str2; // нашли позицию *
        int position = i; 
        int count = 0;
        while (str2[i] != NULL)  // читаем строку посимвольно передвигаем указатель
        {
            if (str2[i] == '<') // найден <
            {
                printf("%c",str2[i]); // что у нас в под указателем?
            }

            if (i > strlen(str1))
                break;
            strcat (final_string,strcat(make_string, ",")); //final_string += make_string + ',';
            memset(&make_string, '\0', sizeof(make_string)); //make_string = "";
            count += 2;
            position = i + (strlen(final_string) - count);
        }
        strcat(final_string, make_string);  //final_string += make_string;
        printf("%s\n",final_string);
        return 0;
}

Вопросы: как сделать чтобы вторая функция find искала следующую звезду?

Цикл while требует внутри себя realloc для дописывания строки?

READ ALSO
Можно ли в Linux делать асинхронные вызовы одного и того-же сокета не защищая его?

Можно ли в Linux делать асинхронные вызовы одного и того-же сокета не защищая его?

Доброго времени сутокПишу клиент-серверное приложение на С++ под Linux

153
Ошибка доступа к памяти в методе класса

Ошибка доступа к памяти в методе класса

Беда следующая: работаю со списком в классе(Использование STL запрещено) худо бедно расписал методыДалее когда описываю экземпляр в main и пытаюсь...

182
Ошибка сегментирования что делать?

Ошибка сегментирования что делать?

Вылетает ошибка сегментирования (сделан дамп памяти)Если не сложно, объясните, что именно не так

205