strtok会影响输入缓冲区

时间:2014-04-21 06:50:01

标签: c 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是否会释放内存?

2 个答案:

答案 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);  
}