NAME

strtoul, strtoull, strtouq - 문자열을 부호 없는 long 정수로 변환하기

SYNOPSIS

#include <stdlib.h>

unsigned long strtoul(const char *restrict nptr,
                      char **restrict endptr, int base);
unsigned long long strtoull(const char *restrict nptr,
                      char **restrict endptr, int base);

glibc 기능 확인 매크로 요건 (feature_test_macros(7) 참고):

strtoull():
_ISOC99_SOURCE
|| /* glibc <= 2.19: */ _SVID_SOURCE || _BSD_SOURCE

DESCRIPTION

strtoul() 함수는 nptr에 있는 문자열의 처음 부분을 지정한 base에 따라 unsigned long 값으로 변환한다. 기수는 2와 36 사이이거나 특수한 값 0이어야 한다.

문자열이 임의 개수의 공백(isspace(3)으로 판단)으로 시작할 수 있으며 그 다음에 선택적으로 '+' 내지 '-' 부호 한 개가 올 수 있다. base가 0이나 16이면 문자열에서 다음에 "0x" 접두부가 있을 수 있으며, 그러면 수를 16진수로 읽어 들인다. 그렇지 않고 다음 문자가 '0'이면 base 0을 8로 (8진수로) 받아들이며, 아니면 10으로 (10진수로) 받아들인다.

문자열 나머지를 명백한 방식으로 unsigned long 값으로 변환하며 해당 기수에서 유효 숫자가 아닌 첫 번째 문자에서 멈춘다. (기수가 10보다 큰 경우 대소문자 글자 'A'가 10을, 'B'가 11을 나타내며, 그런 식으로 'Z'가 35를 나타낸다.)

endptr이 NULL이 아니면 strtoul()은 첫 번째 비유효 문자의 주소를 *endptr에 저장한다. 숫자가 전혀 없었으면 strtoul()nptr의 원래 값을 *endptr에 저장한다. (그리고 0을 반환한다.) 특히 *nptr이 '\0'이 아닌데 반환 시 **endptr이 '\0'이면 문자열 전체가 유효한 것이다.

strtoull() 함수는 strtoul() 함수처럼 동작하되 unsigned long long 값을 반환한다.

RETURN VALUE

원래 값이 오버플로 되지 않으면 strtoul() 함수는 변환 결과를, 또는 앞에 음수 부호가 있었으면 부호 없는 값으로 표현한 변환 결과의 반수를 반환한다. 오버플로가 일어나면 strtoul()ULONG_MAX를 반환하며 errnoERANGE로 설정한다. 같은 내용이 strtoull()에 (ULONG_MAX 대신 ULLONG_MAX로) 적용된다.

ERRORS

EINVAL
(C99에는 없음) 지정한 base가 지원하지 않는 값을 담고 있다.
ERANGE
결과 값이 범위를 벗어났다.

구현에서 변환을 전혀 수행하지 않은 경우에 (숫자 없음, 0 반환) errnoEINVAL로 설정할 수도 있다.

ATTRIBUTES

이 절에서 사용하는 용어들에 대한 설명은 attributes(7)를 보라.

인터페이스 속성
strtoul(), strtoull(), strtouq() 스레드 안전성 MT-Safe locale

CONFORMING TO

strtoul(): POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4.

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

NOTES

strtoul()이 성공과 실패 어느 쪽에서도 적법하게 0이나 ULONG_MAX를 (strtoull()에선 ULLONG_MAX) 반환할 수 있으므로 호출 프로그램에서는 호출 전에 errno를 0으로 설정하고서 호출 후에 errno가 0 아닌 값인지 검사해서 오류가 발생했는지 확인해야 한다.

"C" 외의 로캘에서 다른 숫자 문자열들을 받아들일 수도 있다. (예를 들어 현재 로캘의 천 단위 구분자를 지원할 수도 있다.)

BSD에는 완전히 유사하게 정의된 다음 함수가 있다.

u_quad_t strtouq(const char *nptr, char **endptr, int base);

현재 아키텍처의 워드 크기에 따라 strtoull()이나 strtoul()과 동등할 수 있다.

음수 값을 유효한 것으로 보아 조용히 동등한 unsigned long 값으로 변환한다.

EXAMPLES

strtol(3) 매뉴얼 페이지의 예를 참고하라. 이 매뉴얼 페이지에서 기술하는 함수들과 사용 방식이 비슷하다.

SEE ALSO

a64l(3), atof(3), atoi(3), atol(3), strtod(3), strtol(3), strtoumax(3)


2021-03-22