Извлечь строку между двумя конкретными строками в C

Как вы извлекаете строки между двумя указанными строками? Например:<title>Extract this</title>, Есть ли простой способ получить его с помощью strtok() или что-нибудь попроще?

РЕДАКТИРОВАТЬ: две указанные строки <title> а также </title> и извлеченная строка Extract this,

3 ответа

Решение
  • Поиск первой подстроки с помощью strstr(),
  • Если найдено, сохраните индекс массива подстроки
  • Оттуда ищите следующую подстроку.
  • Если найдено, все между [ [start of sub string 1] + [length of sub string 1] ] а также [start of sub string 2] это строка, которая вас интересует
  • Извлеките строку, используя strncpy() или же memcpy(),

Это пример того, как вы можете это сделать, это не проверка целостности входной строки

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *extract(const char *const string, const char *const left, const char *const right)
{
    char  *head;
    char  *tail;
    size_t length;
    char  *result;

    if ((string == NULL) || (left == NULL) || (right == NULL))
        return NULL;
    length = strlen(left);
    head   = strstr(string, left);
    if (head == NULL)
        return NULL;
    head += length;
    tail  = strstr(head, right);
    if (tail == NULL)
        return tail;
    length = tail - head;
    result = malloc(1 + length);
    if (result == NULL)
        return NULL;
    result[length] = '\0';

    memcpy(result, head, length);
    return result;
}

int main(void)
{
    char  string[] = "<title>The Title</title>";
    char *value;

    value = extract(string, "<title>", "</title>");
    if (value != NULL)
        printf("%s\n", value);
    free(value);

    return 0;
}

Ответ мистера @Lundin хороший. Тем не менее, просто чтобы добавить более общий подход (без учета <tag> само значение), вы также можете сделать, как,

  1. Найдите первый экземпляр < [тег открывающая угловая скобка] с помощью strchr()
  2. найти первый первый экземпляр > [тег закрывающей угловой скобки] с помощью strchr(),
  3. сохраните индексы и разницу двух индексов, скопируйте строку во временный массив. будет относиться как tag значение.
  4. Найдите последний экземпляр < [тег открывающая угловая скобка] с помощью strrchr()
  5. найти последний экземпляр > [тег закрывающей угловой скобки] с помощью strrchr(),
  6. Опять же, сохраните индексы и разницу двух индексов, скопируйте строку в другой временный массив. Сравните с ранее сохраненным tag значение, если равно, сделать memcpy() / strdup() от acualarray[first_last_index] (закрывающий начальный тег) до acualarray[last_first_index] (начало закрывающего тега.)
Другие вопросы по тегам