strtok 관련 질문입니다...

dragem의 이미지

a란 함수에서 strtok을 쓰다가 b란 함수를 호출하여
그 속에서 strtok을 사용하면 안되는 겁니까?

a(char *buf)
{
    char *tok;
    tok = strtok(buf, " \n");
    while( tok != NULL)
    {
            b(tok);
            tok = strtok(NULL, " \n");
    }
}


b(char *buf)
{
    char *tok;
    tok = strtok(buf, " \n");
    while( tok != NULL)
    {
        printf("%s", tok);
        tok = strtok(NULL, " \n");
    }
}

다른 함수에서 사용된 strtok이 내부버퍼를 공유하여 제대로 동작하지 않는거 같습니다.. 이럴때 어떻게 해결하는 방법이 있을까요...

버려진의 이미지

어떤 의도로 작성하신 코드인지는 잘 모르겠지만...

포인터를 따라가보세요.

a에서 buf로 받은 것, a의 tok, a의 tok을 b의 buf로 주고, 그건 또 b의 tok으로...

문자열을 복사한다던지 하는 방식으로 동작해야겠지요.

정태영의 이미지

strtok_r 이던가.. 하튼.. thread_safe 한 버젼을 쓰세요..

=3=33

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

익명 사용자의 이미지

strsep(3)을 쓰셔도 됩니다. 저는 왠지 이게 더 편하더군요.

charsyam의 이미지

dragem wrote:
a란 함수에서 strtok을 쓰다가 b란 함수를 호출하여
그 속에서 strtok을 사용하면 안되는 겁니까?

a(char *buf)
{
    char *tok;
    tok = strtok(buf, " \n");
    while( tok != NULL)
    {
            b(tok);
            tok = strtok(NULL, " \n");
    }
}


b(char *buf)
{
    char *tok;
    tok = strtok(buf, " \n");
    while( tok != NULL)
    {
        printf("%s", tok);
        tok = strtok(NULL, " \n");
    }
}

다른 함수에서 사용된 strtok이 내부버퍼를 공유하여 제대로 동작하지 않는거 같습니다.. 이럴때 어떻게 해결하는 방법이 있을까요...

기본적으로 strtok 는 내부적으로 static 을 이용합니다. 당연히 이렇게 부르면
쓸수가 없는게 당연합니다. 고운 하루되시길...

=========================
CharSyam ^^ --- 고운 하루
=========================

정태영의 이미지

charsyam wrote:
기본적으로 strtok 는 내부적으로 static 을 이용합니다. 당연히 이렇게 부르면
쓸수가 없는게 당연합니다. 고운 하루되시길...

strtok_r 은.. static 버퍼를 이용하지 않습니다 ;)

     char *
     strtok(char *str, const char *sep);

     char *
     strtok_r(char *str, const char *sep, char **last);

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

charsyam의 이미지

정태영 wrote:
charsyam wrote:
기본적으로 strtok 는 내부적으로 static 을 이용합니다. 당연히 이렇게 부르면
쓸수가 없는게 당연합니다. 고운 하루되시길...

strtok_r 은.. static 버퍼를 이용하지 않습니다 ;)

     char *
     strtok(char *str, const char *sep);

     char *
     strtok_r(char *str, const char *sep, char **last);

쿨럭, 물론 알고 있습니다. 그래서 기본적으로라고 한겁니다. 쿨럭... 흑흑흑
태영님 나빠요 T^T

=========================
CharSyam ^^ --- 고운 하루
=========================

kicom95의 이미지

OS 에 따라서 없는 경우도 있습니다 참조 하시길 바랍니다.

char * strtok_r(char *s, const char *delim, char **last) 
{
    const char *spanp;
    int c, sc;
    char *tok;

    if (s == NULL && (s = *last) == NULL)
	return NULL;

cont:
    c = *s++;
    for (spanp = delim; (sc = *spanp++) != 0; )
    {
	if (c == sc)
	{
	    goto cont;
	}
    }

    if (c == 0)		/* no non-delimiter characters */
    {
	*last = NULL;
	return NULL;
    }
    tok = s - 1;

    for ( ; ; )
    {
	c = *s++;
	spanp = delim;
	do
	{
	    if ((sc = *spanp++) == c)
	    {
		if (c == 0)
		{
		    s = NULL;
		}
		else
		{
		    char *w = s - 1;
		    *w = '\0';
		}
		*last = s;
		return tok;
	    }
	}
	while (sc != 0);
    }
}

가자 해외로 ~ .. 돈 벌러.

익명 사용자의 이미지

kicom95 wrote:
OS 에 따라서 없는 경우도 있습니다 참조 하시길 바랍니다.

char * strtok_r(char *s, const char *delim, char **last) 
{
    const char *spanp;
    int c, sc;
    char *tok;

    if (s == NULL && (s = *last) == NULL)
	return NULL;

cont:
    c = *s++;
    for (spanp = delim; (sc = *spanp++) != 0; )
    {
	if (c == sc)
	{
	    goto cont;
	}
    }

    if (c == 0)		/* no non-delimiter characters */
    {
	*last = NULL;
	return NULL;
    }
    tok = s - 1;

    for ( ; ; )
    {
	c = *s++;
	spanp = delim;
	do
	{
	    if ((sc = *spanp++) == c)
	    {
		if (c == 0)
		{
		    s = NULL;
		}
		else
		{
		    char *w = s - 1;
		    *w = '\0';
		}
		*last = s;
		return tok;
	    }
	}
	while (sc != 0);
    }
}

흐윽 저기요 저는 strtok 를 말한겁니다. strtok_r 을 말한게 아니구요 T.T

madkoala의 이미지

다른 분들이 달아주신 답변은, strtok를 그런 식으로 사용하면 내부에서 사용하는 static 변수때문에 정상적으로 작동하지 않으니, strtok_r을 사용하라고 충고해주신 겁니다.

굳이 strtok를 쓰셔야만 하는 상황이라면(제 경험으로 보면 그런 일은 거의 없지만) 버퍼를 복사해놓고, 한 버퍼에 대해서 다 처리한 후에,
다른 버퍼를 처리하셔야 할 겁니다.

어쨌든, 질문자께서 지금 사용하신 방법으로는 원하시는 일을 할 수 없을 겁니다.