我使用strtok来标记字符串,是strtok会影响原始缓冲区吗?例如:
*char buf[] = "This Is Start Of life";
char *pch = strtok(buf," ");
while(pch)
{
printf("%s \n", pch);
pch = strtok(NULL," ");
}*
printf("Orignal Buffer:: %s ",buf);
Output is::
This
Is
Start
Of
life
Original Buffer:: This
我读到strtok返回指向下一个标记的指针,那么buf是如何受到影响的?有没有办法保留原始缓冲区(没有额外的复制开销)?
后续问题::从目前为止的答案我猜有没有办法保留缓冲区。那么,如果我使用动态数组来创建原始缓冲区,如果strtok会影响它,那么在释放原始缓冲区时会出现内存泄漏,或者strtok是否会释放内存?
答案 0 :(得分:4)
strtok()
没有创建新字符串并将其返回;它返回一个指向您作为参数传递给strtok()
的字符串中的标记的指针。因此原始字符串会受到影响。
strtok()
打破字符串意味着它用NULL替换delimiter
字符并返回指向该标记开头的指针。因此,运行strtok()
后,delim
个字符将被NULL字符替换。您可以阅读link1 link2。
正如您在link2
中的示例输出中所看到的,您获得的输出符合预期,因为delim
字符已替换为strtok
。
答案 1 :(得分:3)
执行strtok(NULL, "|")
时,strtok
找到一个令牌并将null置于原位(用'\0'
替换分隔符)并修改字符串。因此,您需要在标记化之前制作原始字符串的副本。
请尝试以下:
void main(void)
{
char buf[] = "This Is Start Of life";
char *buf1;
/* calloc() function will allocate the memory & initialize its to the NULL*/
buf1 = calloc(strlen(buf)+1, sizeof(char));
strcpy(buf1, buf);
char *pch = strtok(buf," ");
while(pch)
{
printf("%s \n", pch);
pch = strtok(NULL," ");
}
printf("Original Buffer:: %s ",buf1);
}