strtok(3) - wariua/manpages-ko GitHub Wiki

NAME

strtok, strtok_r - ๋ฌธ์ž์—ด์—์„œ ํ† ํฐ ๋ฝ‘์•„๋‚ด๊ธฐ

SYNOPSIS

#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

DESCRIPTION

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() ํ˜ธ์ถœ๋“ค์„ ์ด์šฉํ•ด ์—ฌ๋Ÿฌ ๋ฌธ์ž์—ด์„ ๋™์‹œ์— ๋ถ„ํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

RETURN VALUE

strtok() ๋ฐ strtok_r() ํ•จ์ˆ˜๋Š” ๋‹ค์Œ ํ† ํฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ† ํฐ์ด ๋” ์—†์œผ๋ฉด NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ATTRIBUTES

์ด ์ ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์šฉ์–ด๋“ค์— ๋Œ€ํ•œ ์„ค๋ช…์€ attributes(7)๋ฅผ ๋ณด๋ผ.

์ธํ„ฐํŽ˜์ด์Šค ์†์„ฑ ๊ฐ’
strtok() ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ MT-Unsafe race:strtok
strtok_r() ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ MT-Safe

CONFORMING TO

strtok()
POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.
strtok_r()
POSIX.1-2001, POSIX.1-2008.

BUGS

์ด ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์กฐ์‹ฌํ•ด์•ผ ํ•œ๋‹ค. ๊ผญ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋ฉด ๋‹ค์Œ์— ์œ ๋…ํ•ด์•ผ ํ•œ๋‹ค.

  • ์ด ํ•จ์ˆ˜๋“ค์€ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.

  • ์ด ํ•จ์ˆ˜๋“ค์€ ์ƒ์ˆ˜ ๋ฌธ์ž์—ด์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

  • ๊ตฌ๋ถ„์ž ๋ฐ”์ดํŠธ์˜ ์›๋ž˜ ๊ฐ’์„ ์•Œ ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

  • strtok() ํ•จ์ˆ˜๋Š” ๋ถ„ํ•ดํ•˜๋Š” ๋™์•ˆ ์ •์  ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋”ฐ๋ผ์„œ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค. ์ด๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค๋ฉด strtok_r()์„ ์‚ฌ์šฉํ•˜๋ผ.

EXAMPLE

์•„๋ž˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” 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)์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

SEE ALSO

index(3), memchr(3), rindex(3), strchr(3), string(3), strpbrk(3), strsep(3), strspn(3), strstr(3), wcstok(3)


2019-03-06

โš ๏ธ **GitHub.com Fallback** โš ๏ธ