개요
atoi 함수는 C 언어 표준 라이브러리에서 제공하는 문자열 변환 함수로, ASCII 문자열(string)을 정수(integer)로 변환하는 역할을 한다. 함수 이름 'atoi'는 'ASCII to Integer'의 약자로, 문자열에 포함된 숫자를 정수 값으로 해석한다. 하지만 atoi 함수는 숫자가 아닌 문자를 포함한 문자열을 처리할 때 특별한 규칙을 따르며, 이러한 특성을 이해하는 것은 프로그래밍 시 예상치 못한 버그를 방지하는 데 중요하다.
설명
atoi 함수는 <stdlib.h> 헤더 파일에 선언되어 있으며, 문자열을 정수로 변환하는 기본적인 도구로 사용된다. 함수의 원형은 다음과 같다:
int atoi(const char *str);
이 함수는 다음과 같은 변환 규칙을 따른다:
- 문자열의 앞부분에 있는 공백 문자(white space)는 무시된다.
- 그 다음에 오는 부호 문자('+' 또는 '-')가 있으면 인식한다.
- 숫자 문자('0'부터 '9')가 나타나면 이를 정수 값으로 변환한다.
- 숫자가 아닌 문자가 나타나면 그 시점에서 변환을 중단하고 그때까지 변환된 값을 반환한다.
- 문자열이 유효한 숫자로 시작하지 않으면 0을 반환한다.
특징
atoi 함수의 주요 특징은 다음과 같다:
- 부분 변환: 숫자가 아닌 문자가 나타나면 그 전까지의 숫자만 변환한다. 이는 atoi가 문자열을 좌에서 우로 순차적으로 처리하기 때문이다.
- 오류 처리 부재: atoi 함수는 변환 중 오류가 발생해도 이를 알리는 메커니즘이 없다. 잘못된 입력에 대해 0을 반환하지만, 실제 문자열 "0"에 대해서도 같은 값을 반환하므로 오류와 유효한 입력을 구분할 수 없다.
- 범위 검사 없음: 입력 문자열이 표현할 수 있는 정수 범위를 초과하면 정의되지 않은 동작(undefined behavior)을 초래할 수 있다.
- 공백 처리: 문자열 앞부분의 공백은 무시되지만, 숫자 사이의 공백은 변환을 중단시킨다.
- 부호 인식: 숫자 앞에 '+' 또는 '-' 부호가 있으면 이를 인식하여 결과에 반영한다.
예시
다음 예제를 통해 atoi 함수의 동작을 살펴보자:
#include <stdio.h>
#include <stdlib.h>
int main()
{
// 기본적인 숫자 변환
int test1 = atoi("123"); // 123
// 문자로 시작하는 경우
int test2 = atoi("abc123"); // 0
// 숫자와 문자가 혼합된 경우
int test3 = atoi("1abc23"); // 1
int test4 = atoi("123abc"); // 123
// 공백이 포함된 경우
int test5 = atoi(" 456"); // 456
int test6 = atoi("78 90"); // 78
// 부호가 포함된 경우
int test7 = atoi("-42"); // -42
int test8 = atoi("+99"); // 99
printf("test1: %d\n", test1);
printf("test2: %d\n", test2);
printf("test3: %d\n", test3);
printf("test4: %d\n", test4);
printf("test5: %d\n", test5);
printf("test6: %d\n", test6);
printf("test7: %d\n", test7);
printf("test8: %d\n", test8);
return 0;
}
실행 결과:
test1: 123
test2: 0
test3: 1
test4: 123
test5: 456
test6: 78
test7: -42
test8: 99
이 결과에서 알 수 있듯이, atoi 함수는 다음과 같은 방식으로 동작한다:
- 순수한 숫자 문자열은 예상대로 변환된다.
- 문자로 시작하는 문자열은 0을 반환한다.
- 숫자 다음에 문자가 나오면 문자가 나오기 전까지의 숫자만 변환한다.
- 문자열 앞의 공백은 무시되지만, 숫자 사이의 공백은 변환을 중단시킨다.
- 부호 문자는 인식되어 결과에 반영된다.
결론
atoi 함수는 간단한 문자열-정수 변환에 유용하지만, 몇 가지 주요 제한사항을 가지고 있다. 특히 오류 처리 메커니즘이 없고 범위 검사를 수행하지 않는다는 점에서 주의가 필요하다. 또한 숫자가 아닌 문자를 만나면 변환을 중단하는 특성은 데이터 검증이 중요한 상황에서 문제가 될 수 있다.
보다 안전하고 강력한 문자열-정수 변환이 필요한 경우, C 표준 라이브러리의 strtol, strtoll 함수나 C++의 std::stoi, std::stol 함수를 사용하는 것이 바람직하다. 이러한 함수들은 오류 처리 기능을 제공하고, 변환 중 발생할 수 있는 다양한 상황을 더 잘 처리한다.
프로그래밍에서 atoi를 사용할 때는 이러한 동작 특성을 이해하고, 입력 문자열이 예상된 형식을 가지고 있는지 미리 검증하는 것이 중요하다. 특히 사용자 입력을 처리할 때는 더욱 주의가 필요하다.
참고문헌
- C 표준 라이브러리 문서 - atoi: https://en.cppreference.com/w/c/string/byte/atoi
- Linux man 페이지 - atoi(3): https://man7.org/linux/man-pages/man3/atoi.3.html
- C 프로그래밍: 문자열에서 숫자로의 변환: https://www.tutorialspoint.com/c_standard_library/c_function_atoi.htm
'Programming > C' 카테고리의 다른 글
getpass() 함수 (0) | 2025.04.20 |
---|---|
strchr & strstr 함수로 문자(열) 검색하기 (0) | 2025.04.19 |
이진 탐색 알고리즘의 이해와 구현 (0) | 2025.04.18 |
C언어로 Windows 시스템 레지스트리에 값 저장하기 (0) | 2025.04.17 |
C언어에서 Linux/Windows 시스템의 hostname 확인 방법 분석 (0) | 2025.04.16 |