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개로 잘라서 각각을 저장하고 싶을 수도 있겠죠?

그림 46‑1 여러 개의 정수로 된 문자열을 변환

다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

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"처럼 이전 숫자의 끝 부분부터 시작하게 됩니다.

그림 46‑2 strtol로 여러 개의 숫자로 된 문자열을 변환하기

두 번째부터는 num2 = strtol(end, &end, 10);와 같이 end를 넣어주어 이전 숫자의 끝 부분부터 변환하면 됩니다. 더 변환할 문자열이 없다면 num4 = strtol(end, NULL, 10);와 같이 NULL을 넣어주면 됩니다.