在C中的两个特定字符串之间提取字符串

时间:2015-05-18 11:42:21

标签: c string strtok

如何在两个指定的字符串之间提取字符串? 例如: <title>Extract this</title>。是否有一种简单的方法可以使用strtok()或更简单的方法来获取它?

编辑:指定的两个字符串为<title></title>,提取的字符串为Extract this

3 个答案:

答案 0 :(得分:4)

  • 使用strstr()搜索第一个子字符串。
  • 如果找到,请保存子字符串的数组索引
  • 从那里,搜索下一个子字符串。
  • 如果找到,[ [start of sub string 1] + [length of sub string 1] ][start of sub string 2]之间的所有内容都是您感兴趣的字符串。
  • 使用strncpy()memcpy()
  • 提取字符串

答案 1 :(得分:1)

这是一个如何做到这一点的例子,它没有检查输入字符串的完整性

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

答案 2 :(得分:0)

@Lundin

The answer很好。但是,只是为了添加更通用的方法(不依赖于<tag>值本身),您也可以这样做,

  1. 使用strchr()
  2. 找到< [标签张开角括号]的第一个实例
  3. 使用strchr()找到> [标记结束尖括号]的第一个第一个实例。
  4. 保存索引和两个索引的差异,将字符串复制到临时数组。将视为tag值。
  5. 使用strrchr()
  6. 找到< [标签张开角括号]的最后一个实例
  7. 使用strrchr()找到> [标签结束角括号]的最后一个实例。
  8. 再次,保存索引和两个索引的差异,将字符串复制到另一个临时数组。与先前存储的tag值进行比较,如果等于,则从memcpy()(关闭开始标记)到strdup()(从结束标记开始)执行acualarray[first_last_index] / acualarray[last_first_index]。 )