Извлечь строку между двумя конкретными строками в 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>
само значение), вы также можете сделать, как,
- Найдите первый экземпляр
<
[тег открывающая угловая скобка] с помощьюstrchr()
- найти первый первый экземпляр
>
[тег закрывающей угловой скобки] с помощьюstrchr()
, - сохраните индексы и разницу двух индексов, скопируйте строку во временный массив. будет относиться как
tag
значение. - Найдите последний экземпляр
<
[тег открывающая угловая скобка] с помощьюstrrchr()
- найти последний экземпляр
>
[тег закрывающей угловой скобки] с помощьюstrrchr()
, - Опять же, сохраните индексы и разницу двух индексов, скопируйте строку в другой временный массив. Сравните с ранее сохраненным
tag
значение, если равно, сделатьmemcpy()
/strdup()
отacualarray[first_last_index]
(закрывающий начальный тег) доacualarray[last_first_index]
(начало закрывающего тега.)