strtok(3) - wariua/manpages-ko GitHub Wiki
strtok, strtok_r - ๋ฌธ์์ด์์ ํ ํฐ ๋ฝ์๋ด๊ธฐ
#include <string.h>
char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr);
glibc ๊ธฐ๋ฅ ํ์ธ ๋งคํฌ๋ก ์๊ฑด (feature_test_macros(7) ์ฐธ๊ณ ):
-
strtok_r()
: -
_POSIX_C_SOURCE
|| /* glibc ๋ฒ์ <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE
strtok()
ํจ์๋ ๋ฌธ์์ด์ 0๊ฐ ์ด์์ ๋น์ด ์์ง ์์ ํ ํฐ๋ค์ ์ด๋ก ๋๋๋ค. strtok()
์ ๋ํ ์ฒซ ๋ฒ์งธ ํธ์ถ์์ ๋ถํดํ ๋ฌธ์์ด์ str
๋ก ์ง์ ํด์ผ ํ๋ค. ๊ฐ์ ๋ฌธ์์ด์ ๋ถํดํ๋ ํ์ ํธ์ถ ๊ฐ๊ฐ์์๋ str
์ด NULL์ด์ด์ผ ํ๋ค.
delim
์ธ์๋ ๋ถํด ๋ฌธ์์ด์์ ํ ํฐ๋ค์ ๊ตฌ๋ถํ๋ ๋ฐ์ดํธ๋ค์ ์งํฉ์ ๋ํ๋ธ๋ค. ๊ฐ์ ๋ฌธ์์ด์ ๋ถํดํ๋ ์ฐ์ด์ ํธ์ถ์์ ํธ์ถ์๊ฐ delim
์ ๋ค๋ฅธ ๋ฌธ์์ด๋ค์ ์ง์ ํ ์๋ ์๋ค.
strtok()
ํธ์ถ ๊ฐ๊ฐ์ ๋ค์ ํ ํฐ์ ๋ด์ ๋ ์ข
๋ฃ ๋ฌธ์์ด์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค. ์ด ๋ฌธ์์ด์๋ ๊ตฌ๋ถ์ ๋ฐ์ดํธ๊ฐ ํฌํจ๋์ด ์์ง ์๋ค. ํ ํฐ์ด ๋ ์์ผ๋ฉด strtok()
์ด NULL์ ๋ฐํํ๋ค.
๊ฐ์ ๋ฌธ์์ด์ ๋ํด ๋์ํ๋ ์ฐ์ด์ strtok()
ํธ์ถ์์๋ ํฌ์ธํฐ๋ฅผ ํ๋ ์ ์งํ์ฌ ๋ค์ ํ ํฐ ํ์์ ์์ํ ์ง์ ์ ์์๋ธ๋ค. ์ฒซ ๋ฒ์งธ strtok()
ํธ์ถ์์๋ ์ด ํฌ์ธํฐ๋ฅผ ๋ฌธ์์ด ์ฒซ ๋ฒ์งธ ๋ฐ์ดํธ๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์ค์ ํ๋ค. ๋ค์ ํ ํฐ์ ์์์ ์ ์์๋ด๊ธฐ ์ํด str
๋ด์์ ๋ค์์ ๋์ค๋ ๊ตฌ๋ถ์ ์๋ ๋ฐ์ดํธ๋ฅผ ํ์ํ๋ค. ๊ทธ๋ฐ ๋ฐ์ดํธ๋ฅผ ์ฐพ์ผ๋ฉด ๋ค์ ํ ํฐ์ ์์์ ์ผ๋ก ์ผ๋๋ค. ๊ทธ๋ฐ ๋ฐ์ดํธ๋ฅผ ์ฐพ์ง ๋ชปํ๋ฉด ๋๋ ํ ํฐ์ด ์๋ ๊ฒ์ด๊ณ strtok()
์ด NULL์ ๋ฐํํ๋ค. (๊ทธ๋์ ๋น์ด ์๊ฑฐ๋ ๊ตฌ๋ถ์๋ค๋ง ๋ด๊ณ ์๋ ๋ฌธ์์ด์ ๋ํด์ ์ฒซ ๋ฒ์งธ ํธ์ถ์์ strtok()
์ด NULL์ ๋ฐํํ๊ฒ ๋๋ค.)
๋ค์ ๋ฒ ๊ตฌ๋ถ์ ๋ฐ์ดํธ๋ฅผ ์ฐพ๊ฑฐ๋ ์ข
๋ฃ์ฉ ๋ ๋ฐ์ดํธ('\0'
)๋ฅผ ๋ง๋ ๋๊น์ง ํ์ํ์ฌ ๊ฐ ํ ํฐ์ ๋์ ์ฐพ๋๋ค. ๊ตฌ๋ถ์ ๋ฐ์ดํธ๋ฅผ ์ฐพ์ผ๋ฉด ๋ ๋ฐ์ดํธ๋ก ๋ฎ์ด ์จ์ ํ์ฌ ํ ํฐ์ ๋์ ๋ง๋ ๋ค. ๊ทธ๋ฆฌ๊ณ strtok()
์์ ๊ทธ ๋ค์ ๋ฐ์ดํธ์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ ์ฅํ๋ค. ๋ค์ ํ ํฐ์ ๊ฒ์ํ ๋ ๊ทธ ํฌ์ธํฐ๋ฅผ ์์์ ์ผ๋ก ์ฌ์ฉํ๊ฒ ๋๋ค. ์ด ๊ฒฝ์ฐ์ strtok()
์ ๋ฐ๊ฒฌํ ํ ํฐ ์์์ ์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค.
์ ์ค๋ช
๋ด์ฉ์ ๋ฐ๋ผ์ ๋ถํด ๋ฌธ์์ด ๋ด์ ์ฐ์ํ๋ ๋ ๊ฐ ์ด์์ ๊ตฌ๋ถ์ ๋ฐ์ดํธ ์ด์ ํ ๊ฐ์ ๊ตฌ๋ถ์๋ก ๋ณธ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌธ์์ด ์์์ด๋ ๋์ ์๋ ๊ตฌ๋ถ์ ๋ฐ์ดํธ๋ค์ ๋ฌด์๋๋ค. ์ด๋ฅผ ๋ฌ๋ฆฌ ๋งํ์๋ฉด, strtok()
์ด ๋ฐํํ๋ ํ ํฐ์ ํญ์ ๋น์ด ์์ง ์์ ๋ฌธ์์ด์ด๋ค. ๊ทธ๋์ ์๋ฅผ ๋ค์ด ๋ฌธ์์ด "aaa::bbb,
"๊ฐ ์์ ๋ ๊ตฌ๋ถ์ ๋ฌธ์์ด์ ";,
"๋ก ์ง์ ํด์ strtok()
์ ์ฐ์ด์ด ํธ์ถํ๋ฉด ๋ฌธ์์ด "aaa
"์ "bbb
", ๊ทธ๋ฆฌ๊ณ ๋ ํฌ์ธํฐ๋ฅผ ๋ฐํํ ๊ฒ์ด๋ค.
strtok_r()
ํจ์๋ strtok()
์ ์ฌ์ง์
๊ฐ๋ฅ ๋ฒ์ ์ด๋ค. saveptr
์ธ์๋ char *
๋ณ์์ ๋ํ ํฌ์ธํฐ์ด๋ค. ๊ฐ์ ๋ฌธ์์ด์ ๋ถํดํ๋ ์ฐ์ด์ ํธ์ถ๋ค์์ ๋ฌธ๋งฅ์ ์ ์งํ๊ธฐ ์ํด strtok_r()
๋ด๋ถ์์ ๊ทธ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ค.
์ฒซ ๋ฒ์งธ strtok_r()
ํธ์ถ์์ str
์ ๋ถํดํ ๋ฌธ์์ด์ ๊ฐ๋ฆฌ์ผ์ผ ํ๋ฉฐ saveptr
์ ๊ฐ์ ๋ฌด์๋๋ค. ํ์ ํธ์ถ์์ str
์ NULL์ด์ด์ผ ํ๋ฉฐ saveptr
์ ์ด์ ํธ์ถ ์ดํ ๋ฐ๋์ง ์์์ด์ผ ํ๋ค.
saveptr
์ธ์๋ฅผ ๋ค๋ฅด๊ฒ ์ง์ ํ strtok_r()
ํธ์ถ๋ค์ ์ด์ฉํด ์ฌ๋ฌ ๋ฌธ์์ด์ ๋์์ ๋ถํดํ ์ ์๋ค.
strtok()
๋ฐ strtok_r()
ํจ์๋ ๋ค์ ํ ํฐ์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค. ํ ํฐ์ด ๋ ์์ผ๋ฉด NULL์ ๋ฐํํ๋ค.
์ด ์ ์์ ์ฌ์ฉํ๋ ์ฉ์ด๋ค์ ๋ํ ์ค๋ช ์ attributes(7)๋ฅผ ๋ณด๋ผ.
์ธํฐํ์ด์ค | ์์ฑ | ๊ฐ |
---|---|---|
strtok() |
์ค๋ ๋ ์์ ์ฑ | MT-Unsafe race:strtok |
strtok_r() |
์ค๋ ๋ ์์ ์ฑ | MT-Safe |
strtok()
- POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.
strtok_r()
- POSIX.1-2001, POSIX.1-2008.
์ด ํจ์๋ค์ ์ฌ์ฉํ ๋๋ ์กฐ์ฌํด์ผ ํ๋ค. ๊ผญ ์ฌ์ฉํ๊ฒ ๋ค๋ฉด ๋ค์์ ์ ๋ ํด์ผ ํ๋ค.
-
์ด ํจ์๋ค์ ์ฒซ ๋ฒ์งธ ์ธ์๋ฅผ ๋ณ๊ฒฝํ๋ค.
-
์ด ํจ์๋ค์ ์์ ๋ฌธ์์ด์ ์ฌ์ฉํ ์ ์๋ค.
-
๊ตฌ๋ถ์ ๋ฐ์ดํธ์ ์๋ ๊ฐ์ ์ ์ ์๊ฒ ๋๋ค.
-
strtok()
ํจ์๋ ๋ถํดํ๋ ๋์ ์ ์ ๋ฒํผ๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๋ฐ๋ผ์ ์ค๋ ๋ ์์ ํ์ง ์๋ค. ์ด๊ฒ ๋ฌธ์ ๊ฐ ๋๋ค๋ฉดstrtok_r()
์ ์ฌ์ฉํ๋ผ.
์๋ ํ๋ก๊ทธ๋จ์์๋ strtok_r()
์ ์ฐ๋ ์ค์ฒฉ ๋ฃจํ๋ฅผ ์ด์ฉํด ๋ฌธ์์ด์ ๋ ๋จ๊ณ์ ํ ํฐ๋ค๋ก ๋๋๋ค. ์ฒซ ๋ฒ์งธ ๋ช
๋ นํ ์ธ์๋ ๋ถํดํ ๋ฌธ์์ด์ ๋ํ๋ธ๋ค. ๋ ๋ฒ์งธ ์ธ์๋ ๋ฌธ์์ด์ "ํฐ" ํ ํฐ์ผ๋ก ๋ถ๋ฆฌํ๋ ๋ฐ ์ธ ๊ตฌ๋ถ์ ๋ฐ์ดํธ(๋ค)์ ๋ํ๋ธ๋ค. ์ธ ๋ฒ์งธ ์ธ์๋ "ํฐ" ํ ํฐ์ ํ์ ํ ํฐ์ผ๋ก ๋ถ๋ฆฌํ๋ ๋ฐ ์ธ ๊ตฌ๋ถ์ ๋ฐ์ดํธ(๋ค)์ ๋ํ๋ธ๋ค.
์ด ํ๋ก๊ทธ๋จ์ด ๋ด๋๋ ์ถ๋ ฅ์ ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
$ ./a.out 'a/bbb///cc;xxx:yyy:' ':;' '/'
1: a/bbb///cc
--> a
--> bbb
--> cc
2: xxx
--> xxx
3: yyy
--> yyy
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(int argc, char *argv[])
{
char *str1, *str2, *token, *subtoken;
char *saveptr1, *saveptr2;
int j;
if (argc != 4) {
fprintf(stderr, "Usage: %s string delim subdelim\n",
argv[0]);
exit(EXIT_FAILURE);
}
for (j = 1, str1 = argv[1]; ; j++, str1 = NULL) {
token = strtok_r(str1, argv[2], &saveptr1);
if (token == NULL)
break;
printf("%d: %s\n", j, token);
for (str2 = token; ; str2 = NULL) {
subtoken = strtok_r(str2, argv[3], &saveptr2);
if (subtoken == NULL)
break;
printf(" --> %s\n", subtoken);
}
}
exit(EXIT_SUCCESS);
}
strtok()
์ ์ฌ์ฉํ๋ ๋ ๋ค๋ฅธ ์์ ํ๋ก๊ทธ๋จ์ getaddrinfo_a(3)์์ ์ฐพ์ ์ ์๋ค.
index(3)
, memchr(3), rindex(3)
, strchr(3)
, string(3), strpbrk(3)
, strsep(3), strspn(3)
, strstr(3)
, wcstok(3)
2019-03-06