strtok会影响输入缓冲区

我使用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负责释放内存?

strtok()不会创建一个新字符串并返回它; 它返回一个指向您作为参数传递给strtok()的字符串中的标记的指针。 因此原始字符串会受到影响。

strtok()打破字符串意味着它用NULL替换delimiter字符并返回指向该标记开头的指针。 因此,运行strtok()delim字符将替换为NULL字符。 你可以阅读link1 link2 。

正如您在link2的示例输出中所看到的,您获得的输出是预期的,因为delim字符被strtok替换。

当你执行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); }