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의 자세한 내용을 확인할 수 있어요.