C++의 strtol() 함수는 문자열(string)을 long 정수(long int)로 변환할 때 사용하는 함수입니다. 이 함수는 변환된 마지막 유효 문자 다음 위치를 가리키도록 포인터를 설정해 주기 때문에, 숫자 뒤에 붙어 있는 나머지 문자열도 쉽게 확인할 수 있습니다.
strtol() 함수는 cstdlib 헤더 파일에 포함되어 있으며, 함수 원형은 다음과 같습니다.
long int strtol(const char* str, char** end, int base)
strtol() 함수의 매개변수
이 함수는 세 개의 인자를 받습니다.
- str: 변환을 시작할 문자열의 시작 주소입니다.
- str_end: 함수가 자동으로 설정하는 포인터입니다. 마지막으로 읽은 유효 문자 다음 문자를 가리키며, 더 이상 남은 문자가 없으면 NULL을 가리킵니다.
- base: 숫자를 해석할 진법(밑)을 지정합니다. 지정 가능한 값은 0, 2, 3, …, 35, 36입니다.
반환값
strtol() 함수는 변환된 long int 값을 반환합니다. 만약 변환할 수 있는 문자가 없거나 포인터가 NULL을 가리키면 0을 반환합니다.
예제 1: base = 10 (10진수)
다음 예제에서는 10진수(base = 10)를 기준으로 문자열 앞부분의 숫자를 long 정수로 변환하고, 남은 문자열을 함께 출력합니다.
#include <iostream>
#include <cstdlib>
using namespace std;
main() {
// 두 개의 문자열 정의
char string1[] = "777HelloWorld";
char string2[] = "565Hello";
char* End; // 끝 위치를 가리킬 포인터
int base = 10;
int value;
value = strtol(string1, &End, base);
cout << "문자열 값 = " << string1 << "\n";
cout << "long int 변환 값 = " << value << "\n";
cout << "남은 문자열 = " << End << "\n"; // 정수 이후의 나머지 문자열
value = strtol(string2, &End, base);
cout << "\n문자열 값 = " << string2 << "\n";
cout << "long int 변환 값 = " << value << "\n";
cout << "남은 문자열 = " << End; // 정수 이후의 나머지 문자열
}실행 결과
문자열 값 = 777HelloWorld long int 변환 값 = 777 남은 문자열 = HelloWorld 문자열 값 = 565Hello long int 변환 값 = 565 남은 문자열 = Hello
출력 결과를 보면, strtol() 함수는 문자열 시작 부분의 연속된 숫자만 읽어 정수로 변환하고, End 포인터에는 그 뒤에 남아 있는 문자열("HelloWorld", "Hello")이 저장된 것을 확인할 수 있습니다.
예제 2: base = 16 (16진수)
이번에는 진법을 16으로 지정한 예제입니다. 16진수 형식의 문자열을 입력하면 해당 값을 10진수로 변환하여 출력합니다.
#include <iostream>
#include <cstdlib>
using namespace std;
main() {
// 두 개의 문자열 정의
char string1[] = "5EHelloWorld";
char string2[] = "125Hello";
char* End; // 끝 위치를 가리킬 포인터
int base = 16;
int value;
value = strtol(string1, &End, base);
cout << "문자열 값 = " << string1 << "\n";
cout << "long int 변환 값 = " << value << "\n";
cout << "남은 문자열 = " << End << "\n"; // 정수 이후의 나머지 문자열
value = strtol(string2, &End, base);
cout << "\n문자열 값 = " << string2 << "\n";
cout << "long int 변환 값 = " << value << "\n";
cout << "남은 문자열 = " << End; // 정수 이후의 나머지 문자열
}실행 결과
문자열 값 = 5EHelloWorld long int 변환 값 = 94 남은 문자열 = HelloWorld 문자열 값 = 125Hello long int 변환 값 = 293 남은 문자열 = Hello
첫 번째 문자열의 "5E"는 16진수로 해석되어 10진수 94(5×16 + 14)로 변환되었고, 두 번째 문자열의 "125" 역시 16진수 기준으로 계산되어 10진수 293(1×256 + 2×16 + 5)으로 변환되었습니다.
정리
strtol() 함수는 단순한 문자열-정수 변환을 넘어, 진법 지정과 변환 종료 위치 추적이라는 강력한 기능을 제공합니다. 특히 사용자 입력 파싱이나 설정 파일 처리처럼 숫자와 텍스트가 섞여 있는 데이터를 다룰 때 매우 유용하게 활용할 수 있습니다.