1

在下文中,我尝试在不使用创建副本的情况下拆分字符串strok

#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'
    }
}
4

2 回答 2

3

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

于 2011-01-30T12:19:47.513 回答
0

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

于 2011-01-30T12:25:13.743 回答