Namespaces
Variants

strtol, strtoll

From cppreference.net
< c ‎ | string ‎ | byte
헤더 파일에 정의됨 <stdlib.h>
long strtol ( const char * str, char ** str_end, int base ) ;
(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 ) ;
(C99 이후)

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

(호출 isspace 로 식별되는) 모든 공백 문자들을 버리고 첫 번째 비공백 문자를 찾은 후, 유효한 base-n (여기서 n= base ) 정수 표현을 형성하기 위해 가능한 많은 문자들을 취하여 정수 값으로 변환합니다. 유효한 정수 값은 다음 부분들로 구성됩니다:

  • (선택 사항) 양수 또는 음수 부호
  • (선택 사항) 접두사 ( 0 ) - 8진법 기수 표시 (기수가 8 또는 0 인 경우에만 적용됨)
  • (선택 사항) 접두사 ( 0x 또는 0X ) - 16진법 기수 표시 (기수가 16 또는 0 인 경우에만 적용됨)
  • 숫자 시퀀스

유효한 base 값의 집합은 {0, 2, 3, ..., 36} 입니다. base- 2 정수의 유효한 숫자 집합은 {0, 1} , base- 3 정수의 경우 {0, 1, 2} 입니다. 10 보다 큰 base의 경우, 유효한 숫자에는 알파벳 문자가 포함되며, base- 11 정수의 경우 Aa 부터 base- 36 정수의 Zz 까지입니다. 문자 대소문자는 무시됩니다.

현재 설치된 C locale 에서는 추가 숫자 형식을 허용할 수 있습니다.

base 의 값이 0 인 경우, 숫자 진법은 자동으로 감지됩니다: 접두사가 0 이면 8진법, 접두사가 0x 또는 0X 이면 16진법, 그 외의 경우에는 10진법입니다.

마이너스 기호가 입력 시퀀스의 일부였다면, 숫자 시퀀스로 계산된 숫자 값은 결과 타입에서 단항 마이너스 연산자에 의해 부정된 것처럼 처리됩니다.

이 함수들은 str_end 가 가리키는 포인터를 마지막으로 해석된 숫자 문자 다음의 문자를 가리키도록 설정합니다. 만약 str_end 가 null 포인터인 경우, 이는 무시됩니다.

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

목차

매개변수

str - 해석할 null 종료 바이트 문자열에 대한 포인터
str_end - 문자에 대한 포인터의 포인터
base - 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)
{
    // 오류 처리를 포함한 파싱
    const char* p = "10 200000000000000000000000000000 30 -40 junk";
    printf("Parsing '%s':\n", p);
    for (;;)
    {
        // errno는 라이브러리 함수 호출 시 오류 발생 여부와 관계없이
        // 0이 아닌 값으로 설정될 수 있으므로, 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);
    // 오류 처리 없이 파싱
    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.22.1.4 strtol, strtoll, strtoul, strtoull 함수 (p: TBD)
  • 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)
와이드 문자열을 정수 값으로 변환
(함수)
(C95) (C99)
와이드 문자열을 부호 없는 정수 값으로 변환
(함수)
C++ documentation for strtol , strtoll