이름
       strtok, strtok_r - 문자열에서 토큰들을 뽑아낸다.

사용법
       #include <string.h>

       char *strtok(char *s, const char *delim);

       char *strtok_r(char *s, const char *delim, char **ptrptr);

 

예제를 보면 아래처럼 쉽게 테스트할 수 있다.

==============================

 

#include 
#include 
#include 

int main()
{
    char *temp = "/home/test/HISTORY/history/test_file";
    char *aa, buf[256];

    strncpy(buf, temp, sizeof(buf));

    printf("before strtok : %s\n", buf);
    aa = strtok(buf, "/");
    printf("after strtok :%s\n", buf);
    printf("result : %s\n", aa);

    return 0;
}

==============================

위의 함수를 실행한 결과는 아래처럼 나온다.

$ ./a.out
before strtok : /home/test/HISTORY/history/test_file
after strtok :/home
result : home

 

딜리미터로 슬래쉬 '/'를 썼는데

슬래쉬가 2번째 나타나는 부분 이전까지 잘리는 것을 볼 수 있다.

그리고 return 하는 char 포인터는

첫번째 '/'의 다음을 가리키고 있다.

 

 

 

strtok 함수의 실제 코드를 뜯어보면 아래와 같다.

출처 : http://opensource.apple.com/source/Libc/Libc-167/string.subproj/strtok.c

======================================

 

#include 
#include 

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


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

	/*
	 * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
	 */
cont:
	c = *s++;
	for (spanp = (char *)delim; (sc = *spanp++) != 0;) {
		if (c == sc)
			goto cont;
	}

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

	/*
	 * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
	 * Note that delim must have one NUL; we stop if we see that, too.
	 */
	for (;;) {
		c = *s++;
		spanp = (char *)delim;
		do {
			if ((sc = *spanp++) == c) {
				if (c == 0)
					s = NULL;
				else
					s[-1] = 0;
				last = s;
				return (tok);
			}
		} while (sc != 0);
	}
	/* NOTREACHED */
}

 

======================================

 

 

반응형

'Language > C' 카테고리의 다른 글

strdup 함수 예제  (476) 2012.08.14
getutxent 함수 예제  (3681) 2012.08.13
writev 함수 예제  (472) 2012.07.31
readv 함수 예제  (480) 2012.07.30
poll 함수 예제  (150) 2012.07.26

+ Recent posts