在C中的两个特定字符串之间提取字符串
Extract string between two specific strings in C
如何提取两个指定字符串之间的字符串?
例如:
<title>Extract this</title>
。有没有一种简单的方法可以使用 strtok()
或更简单的方法来获取它?
编辑:两个指定的字符串是<title>
和</title>
,提取的字符串是Extract this
。
- 使用
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] = '[=10=]';
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 closing angle bracket] 的第一个实例
- 保存索引和两个索引的差值,将字符串复制到一个临时数组中。将视为
tag
值。
- 使用
strrchr()
找到 <
[标签左尖括号] 的最后一个实例
- 使用
strrchr()
. 查找 >
[标签右尖括号] 的最后一个实例
- 再次保存索引和两个索引的差值,将字符串复制到另一个临时数组中。与先前存储的
tag
值进行比较,如果相等,则执行从 acualarray[first_last_index]
(结束起始标记)到 acualarray[last_first_index]
(结束标记开始)的 memcpy()
/ strdup()
。 )
如何提取两个指定字符串之间的字符串?
例如:
<title>Extract this</title>
。有没有一种简单的方法可以使用 strtok()
或更简单的方法来获取它?
编辑:两个指定的字符串是<title>
和</title>
,提取的字符串是Extract this
。
- 使用
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] = '[=10=]';
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;
}
<tag>
值本身),您也可以这样做,
- 使用
strchr()
找到 - 使用
strchr()
. 找到 - 保存索引和两个索引的差值,将字符串复制到一个临时数组中。将视为
tag
值。 - 使用
strrchr()
找到 - 使用
strrchr()
. 查找 - 再次保存索引和两个索引的差值,将字符串复制到另一个临时数组中。与先前存储的
tag
值进行比较,如果相等,则执行从acualarray[first_last_index]
(结束起始标记)到acualarray[last_first_index]
(结束标记开始)的memcpy()
/strdup()
。 )
<
[标签左尖括号] 的第一个实例
>
[tag closing angle bracket] 的第一个实例
<
[标签左尖括号] 的最后一个实例
>
[标签右尖括号] 的最后一个实例