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

NAME

strtol, strtoll, strtoq - λ¬Έμžμ—΄μ„ long μ •μˆ˜λ‘œ λ³€ν™˜ν•˜κΈ°

SYNOPSIS

#include <stdlib.h>

long int strtol(const char *nptr, char **endptr, int base);

long long int strtoll(const char *nptr, char **endptr, int base);

glibc κΈ°λŠ₯ 확인 맀크둜 μš”κ±΄ (feature_test_macros(7) μ°Έκ³ ):

strtoll():
_ISOC99_SOURCE
|| /* glibc 버전 <= 2.19: */ _SVID_SOURCE || _BSD_SOURCE

DESCRIPTION

strtol() ν•¨μˆ˜λŠ” nptr에 μžˆλŠ” λ¬Έμžμ—΄μ˜ 처음 뢀뢄을 μ§€μ •ν•œ base에 따라 long int κ°’μœΌλ‘œ λ³€ν™˜ν•œλ‹€. κΈ°μˆ˜λŠ” 2와 36 μ‚¬μ΄μ΄κ±°λ‚˜ νŠΉμˆ˜ν•œ κ°’ 0이어야 ν•œλ‹€.

λ¬Έμžμ—΄μ΄ μž„μ˜ 개수의 곡백(isspace(3)으둜 νŒλ‹¨)으둜 μ‹œμž‘ν•  수 있으며 κ·Έ λ‹€μŒμ— μ„ νƒμ μœΌλ‘œ '+' λ‚΄μ§€ '-' λΆ€ν˜Έ ν•œ κ°œκ°€ 올 수 μžˆλ‹€. baseκ°€ 0μ΄λ‚˜ 16이면 λ¬Έμžμ—΄μ—μ„œ λ‹€μŒμ— "0x" λ‚΄μ§€ "0X" 접두뢀가 μžˆμ„ 수 있으며, 그러면 수λ₯Ό 16μ§„μˆ˜λ‘œ 읽어 듀인닀. κ·Έλ ‡μ§€ μ•Šκ³  λ‹€μŒ λ¬Έμžκ°€ '0'이면 base 0을 8둜 (8μ§„μˆ˜λ‘œ) 받아듀이며, μ•„λ‹ˆλ©΄ 10으둜 (10μ§„μˆ˜λ‘œ) 받아듀인닀.

λ¬Έμžμ—΄ λ‚˜λ¨Έμ§€λ₯Ό λͺ…λ°±ν•œ λ°©μ‹μœΌλ‘œ long int κ°’μœΌλ‘œ λ³€ν™˜ν•˜λ©° ν•΄λ‹Ή κΈ°μˆ˜μ—μ„œ 유효 μˆ«μžκ°€ μ•„λ‹Œ 첫 번째 λ¬Έμžμ—μ„œ λ©ˆμΆ˜λ‹€. (κΈ°μˆ˜κ°€ 10보닀 큰 경우 λŒ€μ†Œλ¬Έμž κΈ€μž 'A'κ°€ 10을, 'B'κ°€ 11을 λ‚˜νƒ€λ‚΄λ©°, 그런 μ‹μœΌλ‘œ 'Z'κ°€ 35λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.)

endptr이 NULL이 μ•„λ‹ˆλ©΄ strtol()은 첫 번째 λΉ„μœ νš¨ 문자의 μ£Όμ†Œλ₯Ό *endptr에 μ €μž₯ν•œλ‹€. μˆ«μžκ°€ μ „ν˜€ μ—†μ—ˆμœΌλ©΄ strtol()은 nptr의 μ›λž˜ 값을 *endptr에 μ €μž₯ν•œλ‹€. (그리고 0을 λ°˜ν™˜ν•œλ‹€.) 특히 *nptr이 '\0'이 μ•„λ‹Œλ° λ°˜ν™˜ μ‹œ **endptr이 '\0'이면 λ¬Έμžμ—΄ 전체가 μœ νš¨ν•œ 것이닀.

strtoll() ν•¨μˆ˜λŠ” strtol() ν•¨μˆ˜μ²˜λŸΌ λ™μž‘ν•˜λ˜ long long int 값을 λ°˜ν™˜ν•œλ‹€.

RETURN VALUE

값이 μ–Έλ”ν”Œλ‘œμš°λ‚˜ μ˜€λ²„ν”Œλ‘œμš° λ˜μ§€ μ•ŠμœΌλ©΄ strtol() ν•¨μˆ˜λŠ” λ³€ν™˜ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€. μ–Έλ”ν”Œλ‘œμš°κ°€ μΌμ–΄λ‚˜λ©΄ strtol()은 LONG_MIN을 λ°˜ν™˜ν•œλ‹€. μ˜€λ²„ν”Œλ‘œμš°κ°€ μΌμ–΄λ‚˜λ©΄ strtol()은 LONG_MAXλ₯Ό λ°˜ν™˜ν•œλ‹€. 두 경우 λͺ¨λ‘μ—μ„œ errnoλ₯Ό ERANGE둜 μ„€μ •ν•œλ‹€. 같은 λ‚΄μš©μ΄ strtoll()에 (LONG_MINκ³Ό LONG_MAX λŒ€μ‹  LLONG_MINκ³Ό LLONG_MAX둜) μ μš©λœλ‹€.

ERRORS

EINVAL
(C99μ—λŠ” μ—†μŒ) μ§€μ •ν•œ baseκ°€ μ§€μ›ν•˜μ§€ μ•ŠλŠ” 값을 λ‹΄κ³  μžˆλ‹€.
ERANGE
κ²°κ³Ό 값이 λ²”μœ„λ₯Ό 벗어났닀.

κ΅¬ν˜„μ—μ„œ λ³€ν™˜μ„ μ „ν˜€ μˆ˜ν–‰ν•˜μ§€ μ•Šμ€ κ²½μš°μ— (숫자 μ—†μŒ, 0 λ°˜ν™˜) errnoλ₯Ό EINVAL둜 μ„€μ •ν•  μˆ˜λ„ μžˆλ‹€.

ATTRIBUTES

이 μ ˆμ—μ„œ μ‚¬μš©ν•˜λŠ” μš©μ–΄λ“€μ— λŒ€ν•œ μ„€λͺ…은 attributes(7)λ₯Ό 보라.

μΈν„°νŽ˜μ΄μŠ€ 속성 κ°’
strtol(), strtoll(), strtoq() μŠ€λ ˆλ“œ μ•ˆμ „μ„± MT-Safe locale

CONFORMING TO

strtol(): POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.

strtoll(): POSIX.1-2001, POSIX.1-2008, C99.

NOTES

strtol()이 성곡과 μ‹€νŒ¨ μ–΄λŠ μͺ½μ—μ„œλ„ μ λ²•ν•˜κ²Œ 0μ΄λ‚˜ LONG_MAX, LONG_MIN을 (strtoll()에선 LLONG_MAX, LLONG_MIN) λ°˜ν™˜ν•  수 μžˆμœΌλ―€λ‘œ 호좜 ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” 호좜 전에 errnoλ₯Ό 0으둜 μ„€μ •ν•˜κ³ μ„œ 호좜 후에 errnoκ°€ 0 μ•„λ‹Œ 값인지 κ²€μ‚¬ν•΄μ„œ 였λ₯˜κ°€ λ°œμƒν–ˆλŠ”μ§€ 확인해야 ν•œλ‹€.

POSIX.1에 λ”°λ₯΄λ©΄ "C" 및 "POSIX" μ™Έμ˜ λ‘œμΊ˜μ—μ„œ 이 ν•¨μˆ˜λ“€μ΄ κ΅¬ν˜„μ—μ„œ μ •μ˜ν•˜λŠ” λ‹€λ₯Έ 숫자 λ¬Έμžμ—΄λ“€μ„ 받아듀일 μˆ˜λ„ μžˆλ‹€.

BSDμ—λŠ” μ™„μ „νžˆ μœ μ‚¬ν•˜κ²Œ μ •μ˜λœ λ‹€μŒ ν•¨μˆ˜κ°€ μžˆλ‹€.

quad_t strtoq(const char *nptr, char **endptr, int base);

ν˜„μž¬ μ•„ν‚€ν…μ²˜μ˜ μ›Œλ“œ 크기에 따라 strtoll()μ΄λ‚˜ strtol()κ³Ό 동등할 수 μžˆλ‹€.

EXAMPLE

μ•„λž˜ ν”„λ‘œκ·Έλž¨μ€ strtol() μ‚¬μš© 방식을 보여 μ€€λ‹€. 첫 번째 λͺ…λ Ήν–‰ μΈμžλŠ” strtol()이 수λ₯Ό νŒŒμ‹± ν•  λ¬Έμžμ—΄μ„ μ§€μ •ν•œλ‹€. 두 번째 (선택적) μΈμžλŠ” λ³€ν™˜μ— μ‚¬μš©ν•  기수λ₯Ό μ§€μ •ν•œλ‹€. (이 인자λ₯Ό 수둜 λ³€ν™˜ν•˜λŠ” 것은 atoi(3) ν•¨μˆ˜μΈλ°, 였λ₯˜ 검사λ₯Ό ν•˜μ§€ μ•ŠμœΌλ©° strtol()보닀 μΈν„°νŽ˜μ΄μŠ€κ°€ λ‹¨μˆœν•˜λ‹€.) λ‹€μŒμ€ 이 ν”„λ‘œκ·Έλž¨μ΄ λ‚΄λ†“λŠ” λͺ‡ κ°€μ§€ μ˜ˆμ‹œ 결과듀이닀.

$ ./a.out 123
strtol() returned 123
$ ./a.out '    123'
strtol() returned 123
$ ./a.out 123abc
strtol() returned 123
Further characters after number: abc
$ ./a.out 123abc 55
strtol: Invalid argument
$ ./a.out ''
No digits were found
$ ./a.out 4000000000
strtol: Numerical result out of range

ν”„λ‘œκ·Έλž¨ μ†ŒμŠ€

#include <stdlib.h>
#include <limits.h>
#include <stdio.h>
#include <errno.h>

int
main(int argc, char *argv[])
{
    int base;
    char *endptr, *str;
    long val;

    if (argc < 2) {
        fprintf(stderr, "Usage: %s str [base]\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    str = argv[1];
    base = (argc > 2) ? atoi(argv[2]) : 10;

    errno = 0;    /* 호좜 ν›„ 성곡/μ‹€νŒ¨ ꡬ별을 μœ„ν•΄ */
    val = strtol(str, &endptr, base);

    /* κ°€λŠ₯ν•œ μ—¬λŸ¬ 였λ₯˜λ“€ 확인 */

    if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN))
            || (errno != 0 && val == 0)) {
        perror("strtol");
        exit(EXIT_FAILURE);
    }

    if (endptr == str) {
        fprintf(stderr, "No digits were found\n");
        exit(EXIT_FAILURE);
    }

    /* μ—¬κΈ°κΉŒμ§€ μ™”λ‹€λ©΄ strtol()μ—μ„œ 수λ₯Ό μ„±κ³΅μ μœΌλ‘œ νŒŒμ‹± ν•œ κ²ƒμž„ */

    printf("strtol() returned %ld\n", val);

    if (*endptr != '\0')        /* λ°˜λ“œμ‹œ 였λ₯˜λŠ” μ•„λ‹˜... */
        printf("Further characters after number: %s\n", endptr);

    exit(EXIT_SUCCESS);
}

SEE ALSO

atof(3), atoi(3), atol(3), strtod(3), strtoul(3), strtoimax(3)


2019-03-06

⚠️ **GitHub.com Fallback** ⚠️