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