cond不是必需的。@SouravGhosh子字符串1:,子字符串2。怎么了?没什么。我真傻。:-)@SouravGhosh子字符串1:,子字符串2。怎么了?没什么。我真傻。:-)如果在堆栈上声明了value,您必须释放它吗?@user1717828否您不

cond不是必需的。@SouravGhosh子字符串1:,子字符串2。怎么了?没什么。我真傻。:-)@SouravGhosh子字符串1:,子字符串2。怎么了?没什么。我真傻。:-)如果在堆栈上声明了value,您必须释放它吗?@user1717828否您不,c,string,strtok,C,String,Strtok,cond不是必需的。@SouravGhosh子字符串1:,子字符串2。怎么了?没什么。我真傻。:-)@SouravGhosh子字符串1:,子字符串2。怎么了?没什么。我真傻。:-)如果在堆栈上声明了value,您必须释放它吗?@user1717828否您不能释放它。@user1717828它不是堆栈变量,请仔细阅读代码。指针存储在堆栈上,指针指向的数据清晰地位于堆上,因为它是在extract()中用malloc()分配的。哇,还在学C!因此,将result指向堆上的内存,将result指针返回到


cond不是必需的。@SouravGhosh子字符串1:
,子字符串2
。怎么了?没什么。我真傻。:-)@SouravGhosh子字符串1:
,子字符串2
。怎么了?没什么。我真傻。:-)如果在堆栈上声明了
value
,您必须释放它吗?@user1717828否您不能释放它。@user1717828它不是堆栈变量,请仔细阅读代码。指针存储在堆栈上,指针指向的数据清晰地位于堆上,因为它是在
extract()
中用
malloc()
分配的。哇,还在学C!因此,将
result
指向堆上的内存,将
result
指针返回到
value
,最后运行
free(value)
释放指向
结果
的内存?使用与初始分配不同的指针释放空间是否符合标准?很抱歉编辑错误。它是指向由
malloc()
返回的相同地址的不同指针。如果在堆栈上声明了
value
,则必须释放它吗?@user1717828不,您不能释放它。@user1717828它不是堆栈变量,请仔细阅读代码。指针存储在堆栈上,指针指向的数据清晰地位于堆上,因为它是在
extract()
中用
malloc()
分配的。哇,还在学C!因此,将
result
指向堆上的内存,将
result
指针返回到
value
,最后运行
free(value)
释放指向
结果
的内存?使用与初始分配不同的指针释放空间是否符合标准?很抱歉编辑错误。它是指向由
malloc()
返回的相同地址的不同指针。
#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;
}