46.2 특정 진법으로 표기된 문자열을 정수로 변환하기
이번에는 특정 진법으로 표기된 문자열을 정수로 변환해보겠습니다. strtol 함수를 사용하면 16진법으로 표기된 문자열을 정수로 바꿀 수 있으며 함수 이름은 string to long에서 따왔습니다(stdlib.h 헤더 파일에 선언되어 있습니다).
- strtol(문자열, 끝포인터, 진법);
- long strtol(char const *_String, char **_EndPtr, int _Radix);
- 성공하면 변환된 정수를 반환, 실패하면 0을 반환
string_to_long.c
#include <stdio.h> #include <stdlib.h> // strtol 함수가 선언된 헤더 파일 int main() { char *s1 = "0xaf10"; // "0xaf10"은 문자열 int num1; num1 = strtol(s1, NULL, 16); // 16진법으로 표기된 문자열을 정수로 변환 printf("%x %d\n", num1, num1); // af10 44816 return 0; }
실행 결과
af10 44816
num1 = strtol(s1, NULL, 16);처럼 변환할 문자열을 저장한 배열(또는 동적 메모리를 할당한 포인터)을 넣어주고 16을 지정하면 16진법으로 표기된 문자열을 정수로 변환할 수 있습니다. 물론 10을 지정하면 10진법으로 표기된 문자열을 정수로 변환할 수 있습니다.
앞에서 strtol 함수의 두 번째 인수(끝 포인터)에 NULL을 넣었는데 이 부분은 여러 개의 정수로 된 문자열을 변환할 때 사용합니다. 예를 들어 16진법, 10진법, 16진법, 10진법으로 표기된 문자열 "0xaf10 42 0x27C 9952"를 4개로 잘라서 각각을 저장하고 싶을 수도 있겠죠?
다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.
string_to_long_multiple_integers.c
#include <stdio.h> #include <stdlib.h> // strtol 함수가 선언된 헤더 파일 int main() { char *s1 = "0xaf10 42 0x27C 9952"; // "0xaf10 42 0x27C 9952"는 문자열 int num1; int num2; int num3; int num4; char *end; // 이전 숫자의 끝 부분을 저장하기 위한 포인터 num1 = strtol(s1, &end, 16); // 16진법으로 표기된 문자열을 정수로 변환 num2 = strtol(end, &end, 10); // 10진법으로 표기된 문자열을 정수로 변환 num3 = strtol(end, &end, 16); // 16진법으로 표기된 문자열을 정수로 변환 num4 = strtol(end, NULL, 10); // 10진법으로 표기된 문자열을 정수로 변환 printf("%x\n", num1); // af10 printf("%d\n", num2); // 42 printf("%X\n", num3); // 27C printf("%d\n", num4); // 9952 return 0; }
실행 결과
af10 42 27C 9952
먼저 s1에는 "0xaf10 42 0x27C 9952"와 같이 16진법으로 표기된 숫자 2개, 10진법으로 표기된 숫자 2개씩 정수가 4개 들어있습니다. 그리고 처음에는 num1 = strtol(s1, &end, 16);와 같이 s1의 첫 부분을 정수로 변환합니다. 여기서 끝 포인터는 &end처럼 end의 메모리 주소를 넣어줍니다. 이렇게 하면 strtol 함수가 실행된 뒤에는 끝 포인터가 " 42 0x27C 9952"처럼 이전 숫자의 끝 부분부터 시작하게 됩니다.
두 번째부터는 num2 = strtol(end, &end, 10);와 같이 end를 넣어주어 이전 숫자의 끝 부분부터 변환하면 됩니다. 더 변환할 문자열이 없다면 num4 = strtol(end, NULL, 10);와 같이 NULL을 넣어주면 됩니다.