atoi, atol, atoll

atoi, atol, atoll

문자열로 들어온 정수를 진짜 정수 값으로 바꾸고 싶을 때 써요. 함수 이름의 ato는 "ASCII to integer"라는 뜻이고, 뒤의 i/l/ll이 반환 타입을 정해요.

출처: cppreference

본문

문법 (Syntax)

int atoi ( const char * str );
long atol ( const char * str );
long long atoll ( const char * str );

설명 (Explanation)

str이 가리키는 바이트 문자열에서 정수 값을 해석해요. 암시적 진수(radix)는 항상 10이에요.

먼저 공백 문자를, 첫 공백이 아닌 문자가 나올 때까지 모두 버려요. 그 다음 유효한 정수 표현을 만들 수 있는 최대한 많은 문자를 가져와 정수 값으로 변환해요. 유효한 정수 값은 다음 부분으로 이뤄져요.

  • (선택) 플러스 또는 마이너스 부호
  • 숫자 자리

결과 값을 표현할 수 없는 경우, 즉 변환된 값이 해당 반환 타입의 범위를 벗어나면 동작이 정의되지 않아요.

매개변수 (Parameters)

  • str — 해석할 널 종료 바이트 문자열

반환값 (Return value)

성공하면 str의 내용에 해당하는 정수 값. 변환이 전혀 이뤄질 수 없으면 0을 반환해요.

참고 (Notes)

이름은 "ASCII to integer"의 줄임말이에요.

예시 (Example)

아래는 다양한 입력 문자열이 어떻게 해석되는지 보여줘요. 숫자로 해석 가능한 부분까지만 읽고 그 뒤는 버리는 동작, 그리고 범위를 벗어나는 입력이 문제가 된다는 점을 눈여겨보세요.

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

int main(void)
{
    printf("%i\n", atoi(" -123junk"));
    printf("%i\n", atoi(" +321dust"));
    printf("%i\n", atoi("0"));
    printf("%i\n", atoi("0042")); // treated as a decimal number with leading zeros
    printf("%i\n", atoi("0x2A")); // only leading zero is converted discarding "x2A"
    printf("%i\n", atoi("junk")); // no conversion can be performed
    printf("%i\n", atoi("2147483648")); // UB: out of range of int
}

가능한 출력 (Possible output):

-123
321
0
42
0
0
-2147483648

"0x2A"에서 0까지만 변환되고 "x2A"는 버려지는 걸 보셨죠? atoi는 16진수를 해석하지 못해요. 또 "2147483648"처럼 int 범위를 넘는 입력은 정의되지 않은 동작이 돼요. 그 점을 염두에 두고 쓰시면 돼요.

참고 문헌 (References)

  • C23 표준 (ISO/IEC 9899:2024): 7.22.1.2 The atoi, atol, and atoll functions (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018): 7.22.1.2 The atoi, atol, and atoll functions (p: 249)
  • C11 표준 (ISO/IEC 9899:2011): 7.22.1.2 The atoi, atol, and atoll functions (p: 341)
  • C99 표준 (ISO/IEC 9899:1999): 7.20.1.2 The atoi, atol, and atoll functions (p: 307)
  • C89/C90 표준 (ISO/IEC 9899:1990): 4.10.1.2 The atoi function, 4.10.1.3 The atol function

더 알아보기

  • 16진수나 다른 진수, 그리고 오류 위치를 알아야 한다면 strtol 계열이 더 적합해요.
  • cppreference 원문에서 atoi의 자세한 내용을 확인할 수 있어요.