2011-01-30 40 views
1

在下面,我想不创建拷贝来分割字符串使用strokstrtok无法标记?

#include <string.h> 

void func(char *c) 
{ 
    char *pch = strtok (c,"#"); 

    while (pch != NULL) 
    { 
     pch = strtok (NULL, "#"); 
    } 
} 

int main() 
{ 
    char c[] = "a#a\nb#b\n"; 

    char *pch = strtok (c,"\n"); 

    while (pch != NULL) 
    { 
     char *p = new char[strlen(pch)+1]; 
     strcpy(p, pch); 

     func(p); //copy of pch 

     pch = strtok (NULL, "\n"); //fails to get pointer to 'b#b' 
    } 
} 

回答

3

呃... ... strtok()可以存储静态缓冲区的标记化字符串。因此,当在func()中调用第二个strtok()时,第一个操作(在main()中)的结果似乎丢失。看看strtok_r()

+1

另一方面(也可能不相关)的笔记,我不明白你为什么混合使用C和C++代码。如果你使用STL字符串和增强库,你可能会让你的生活变得更轻松。 – 2011-01-30 12:24:33

0

strtok使用静态变量,因此它不能工作可重入,并且永远不会线程安全。 strtok_r不是C89/C99仅POSIX。