Namespaces
Variants

strtol, strtoll

cppreference.net에서
헤더 <stdlib.h>
long      strtol( const char*          str, char**          str_end, int base );
에 정의됨 (1) (C99까지)
long      strtol( const char* restrict str, char** restrict str_end, int base );
(C99부터)
long long strtoll( const char* restrict str, char** restrict str_end, int base );
(2) (C99부터)

str이 가리키는 바이트 문자열에서 정수 값을 해석합니다.

isspace를 호출하여 식별되는 공백 문자를 첫 번째 비공백 문자가 나올 때까지 모두 무시한 다음, 가능한 많은 문자를 사용하여 유효한 n진수, n=base 정수 표현을 형성하고 이를 정수 값으로 변환합니다. 유효한 정수 값은 다음 부분들로 구성됩니다:

  • (선택사항) 더하기 또는 빼기 기호
  • (선택사항) 접두사 (0) (8진법을 나타냄, 기수가 8 또는 0인 경우에만 적용)
  • (선택사항) 접두사 (0x 또는 0X) (16진법을 나타냄, 기수가 16 또는 0인 경우에만 적용)
  • 일련의 숫자들

기수에 대해 유효한 값의 범위는 {0, 2, 3, ..., 36}입니다. 2진수 정수의 유효한 숫자 집합은 {0, 1}, 3진수 정수의 유효한 숫자 집합은 {0, 1, 2} 등입니다. 10보다 큰 기수의 경우 유효한 숫자에 알파벳 문자가 포함되며, Aa은 11진수 정수를, Zz은 36진수 정수를 나타냅니다. 문자의 대소문자는 무시됩니다.

현재 설치된 C 로캘에 의해 추가적인 숫자 형식이 허용될 수 있습니다.

base의 값이 0이면, 숫자 기수가 자동으로 감지됩니다. 접두사가 0이면 기수는 8진법, 접두사가 0x 또는 0X이면 기수는 16진법, 그렇지 않으면 기수는 10진법입니다.

입력 시퀀스에 빼기 기호가 포함된 경우, 숫자 시퀀스로 계산된 숫자 값은 결과 형식에서 단항 빼기를 적용한 것처럼 부정됩니다.

이 함수들은 str_end이 가리키는 포인터를 해석된 마지막 숫자 문자 다음의 문자를 가리키도록 설정합니다. str_end가 널 포인터이면 무시됩니다.

str이 비어 있거나 예상된 형식이 아닌 경우, 변환이 수행되지 않으며, (str_end이 널 포인터가 아닌 경우) str의 값이 str_end이 가리키는 객체에 저장됩니다.

매개변수

str - 해석할 널 종료 바이트 문자열을 가리키는 포인터
str_end - 문자에 대한 포인터를 가리키는 포인터
base - 해석된 정수 값의 기수

반환 값

  • 성공하면, str의 내용에 해당하는 정수 값이 반환됩니다.
  • 변환된 값이 해당 반환 형식의 범위를 벗어나면, 범위 오류가 발생하고 (errno를 ERANGE로 설정) 값의 부호와 반환 형식에 따라 LONG_MAX, LONG_MIN, LLONG_MAX 또는 LLONG_MIN이 반환됩니다.
  • 변환을 수행할 수 없으면, 0이 반환됩니다.

예제

#include <errno.h>
#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    // parsing with error handling
    const char* p = "10 200000000000000000000000000000 30 -40 junk";
    printf("Parsing '%s':\n", p);

    for (;;)
    {
        // errno can be set to any non-zero value by a library function call
        // regardless of whether there was an error, so it needs to be cleared
        // in order to check the error set by strtol
        errno = 0;
        char* end;
        const long i = strtol(p, &end, 10);
        if (p == end)
            break;
 
        const bool range_error = errno == ERANGE;
        printf("Extracted '%.*s', strtol returned %ld.", (int)(end-p), p, i);
        p = end;
 
        if (range_error)
            printf("\n --> Range error occurred.");
 
        putchar('\n');
    }
    
    printf("Unextracted leftover: '%s'\n\n", p);
 
    // parsing without error handling
    printf("\"1010\" in binary  --> %ld\n", strtol("1010", NULL, 2));
    printf("\"12\"   in octal   --> %ld\n", strtol("12",   NULL, 8));
    printf("\"A\"    in hex     --> %ld\n", strtol("A",    NULL, 16));
    printf("\"junk\" in base-36 --> %ld\n", strtol("junk", NULL, 36));
    printf("\"012\"  in auto-detected base --> %ld\n", strtol("012",  NULL, 0));
    printf("\"0xA\"  in auto-detected base --> %ld\n", strtol("0xA",  NULL, 0));
    printf("\"junk\" in auto-detected base --> %ld\n", strtol("junk", NULL, 0));
}

가능한 출력:

Parsing '10 200000000000000000000000000000 30 -40 junk':
Extracted '10', strtol returned 10.
Extracted ' 200000000000000000000000000000', strtol returned 9223372036854775807.
 --> Range error occurred.
Extracted ' 30', strtol returned 30.
Extracted ' -40', strtol returned -40.
Unextracted leftover: ' junk'

"1010" in binary  --> 10
"12"   in octal   --> 10
"A"    in hex     --> 10
"junk" in base-36 --> 926192
"012"  in auto-detected base --> 10
"0xA"  in auto-detected base --> 10
"junk" in auto-detected base --> 0

참조

  • C23 표준 (ISO/IEC 9899:2024):
  • 7.24.1.7 strtol, strtoll, strtoul, strtoull 함수 (p: 362-363)
  • C17 표준 (ISO/IEC 9899:2018):
  • 7.22.1.4 strtol, strtoll, strtoul, strtoull 함수 (p: 251-252)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.22.1.4 strtol, strtoll, strtoul, strtoull 함수 (p: 344-345)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.20.1.4 strtol, strtoll, strtoul, strtoull 함수 (p: 310-311)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.10.1.5 strtol 함수

같이 보기

바이트 문자열을 정수 값으로 변환
(함수)
바이트 문자열을 부호 없는 정수 값으로 변환
(함수)
(C95)(C99)
와이드 문자열을 정수 값으로 변환
(함수)
와이드 문자열을 부호 없는 정수 값으로 변환
(함수)
C++ 문서: strtol, strtoll