strtok 无法标记化?

发布于 2024-10-14 17:15:43 字数 509 浏览 4 评论 0原文

在下面,我尝试使用 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'
    }
}

In the following, I'm trying to split string without creating copies using 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'
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

熟人话多 2024-10-21 17:15:43

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

Uhm... strtok() may store the tokenized string in a static buffer. Hence, when second strtok() is called in the func(), the results of the first operation (in the main()) seem to be lost. Take a look at strtok_r().

画尸师 2024-10-21 17:15:43

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

strtok use static variables, therefore it cannot work reentrant and is never threadsafe.
strtok_r is not C89/C99 only POSIX.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文