Вам действительно нужен правильный html-парсер, но для чего-то быстрого и грязного попробуйте:
bool get_url(char **data, char **url, char **desc)
{
bool result = false;
char *ptr = strstr(*data, "<a");
if(NULL != ptr)
{
*data = ptr + 2;
ptr = strstr(*data, "href=\"");
if(NULL != ptr)
{
*data = ptr + 6;
*url = *data;
ptr = strchr(*data, '"');
if(NULL != ptr)
{
*ptr = '\0';
*data = ptr + 1;
ptr = strchr(*data, '>');
if(NULL != ptr)
{
*data = ptr + 1;
*desc = *data;
ptr = strstr(*data, "</a>");
if(NULL != ptr)
{
*ptr = '\0';
*data = ptr + 4;
result = true;
}
}
}
}
}
return result;
}
Не то, что data
обновляется, чтобы выйти за пределы проанализированных данных (это параметр in-out), и что переданная строка изменяется. Я чувствую себя ленивым / слишком занятым, чтобы делать полные решения с выделенными памятью возвращаемыми строками.
Кроме того, вам, вероятно, следует возвращать ошибки в каскаде фигурных скобок (кроме первого), отчасти поэтому я их так сложил. Существуют и другие более аккуратные решения, которые можно адаптировать, чтобы они были более общими.
Таким образом, в основном, вы затем вызываете функцию несколько раз, пока она не возвращает false.