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

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.