Стрток не может токенизироваться? - PullRequest
1 голос
/ 30 января 2011

Далее я пытаюсь разбить строку без создания копий, используя 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'
    }
}

Ответы [ 2 ]

3 голосов
/ 30 января 2011

Мм ... strtok() может хранить токенизированную строку в статическом буфере. Следовательно, когда второй strtok() вызывается в func(), результаты первой операции (в main()) кажутся потерянными. Взгляните на strtok_r().

0 голосов
/ 30 января 2011

strtok использует статические переменные, поэтому он не может работать повторно и никогда не будет потокобезопасным. strtok_r - это не C89 / C99, а только POSIX.

...