Вот код, который смотрит на строку из массива lines_down и сравнивает её с lines_temp. Если находит звездочку, то выписывает значение и продолжает дальше пока не кончатся звездочки. Потом переходит к другой строке.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *substring(const char *str, size_t begin, size_t len) {
if (str == 0 || strlen(str) == 0 || strlen(str) < begin ||
strlen(str) < (begin + len))
return 0;
return strndup(str + begin, len);
}
int main() {
char *make_string = NULL;
char *final_string = NULL;
char **lines_down = (char *[]){"<tr> <th>Test_Value_1</th> <th>4334</th> </tr>",
"<tr> <th>Test_Value_2</th> <th>5467</th> </tr>",
"<tr> <th>Test_Value_3</th> <th>34543</th> </tr>",
NULL
};
char **lines_temp = (char *[]){"!#<tr> <th>*</th> <th>*</th> </tr>",
"!#<tr> <th>*</th> <th>*</th> </tr>",
"!#<tr> <th>*</th> <th>*</th> </tr>",
NULL
};
char *substr_temp = NULL;
size_t comma_length = 1;
size_t final_string_length = 0;
while (*lines_temp && *lines_down) {
if (strstr(*lines_temp, "!#") != NULL) {
substr_temp = substring(*lines_temp, 2, strlen(*lines_temp) - 2);
size_t i = 0;
size_t i2 = 0;
size_t str1_length = strlen(*lines_down);
size_t str2_length = strlen(substr_temp);
char *ptr2 = strchr(substr_temp, '*'); //указатель на * в str2
char *ptr1 = NULL; //указатель на < в str1
size_t position = ptr2 - substr_temp;
size_t count = 0;
while (ptr2 != NULL) { // пока находится указатель на звёздочку в str2
//позиция *
i = ptr2 - substr_temp;
//ищем < в str1
if (position < str1_length) {
ptr1 = strchr(*lines_down + position, '<');
} else ptr1 = NULL;
if (ptr1 != NULL)//если найден <
{
// ==========================================
// на четвертой итерации здесь копируется мусор, а потом Test_Value_3 вместо 5467
size_t substr_length = ptr1 - (*lines_down + position); // строка под звездочкой
make_string = realloc(make_string, substr_length + 1); // выделить память для подстроки плюс нулевой символ
strncpy(make_string, *lines_down + position, substr_length); // скопировать в make_string строку под звездочкой из исходной строки (lines_down + позиция *)
make_string[substr_length] = '\0'; // добавить строку под звездочкой в make_string
//скопировать в финальную строку и добавить запятую в конец
final_string = realloc(final_string, final_string_length + substr_length + comma_length + 1); // память - длина final_string + длина строки под звездочкой + запятая + нулевой символ
final_string[final_string_length] = '\0'; // добавить нулевой символ
final_string = strcat(final_string, make_string); // копируем make_string в final_string
final_string = strcat(final_string, ","); // добавляем запятую
final_string_length = final_string_length + substr_length + 1; // считаем новую длину строки final_string
i++; //увеличиваем позицию начала поиска звёздочки
if (i < str2_length) { //ищем следующую *
ptr2 = strchr(substr_temp + i, '*');
i = ptr2 - substr_temp;
count = count + 2;
position = i + (final_string_length - count);
} else ptr2 = NULL;
} else ptr2 = NULL;//дальше искать нет смысла
}
//добавляем последнюю запятую
final_string = realloc(final_string, final_string_length + 1);
final_string[final_string_length] = '\0';
final_string = strcat(final_string, ",");
}
++lines_down;
++lines_temp;
}
printf("%s\n", final_string);
return 0;
}
Результат работы программы: Test_Value_1,4334,Test_Value_2,Test_Value_3,,
Ожидаемый результат: Test_Value_1,4334,Test_Value_2,5467,Test_Value_3,34543,
На четвертом цикле position = 49 и сюда не попадает:
if (position < str1_length) {
ptr1 = strchr(*lines_down + position, '<');