본문 바로가기
프로그래밍/C

C ] strtol, strtoul : 정수 문자열을 진수 선택하여 long/unsigned long 값으로 변환 (2진수, 8진수, 10진수, 16진수)

by eteo 2023. 1. 15.

 

 

strtol

 

strtol 함수는 정수로 구성된 문자열 str을 세번째 파라미터인 진수체계로 판단하여 long 형식 값으로 반환한다. 더이상 계산할 수 없는 문자를 발견하면 두번째 파라미터인 endptr에 해당 위치를 저장한다.

 

#include <stdlib.h>

long strtol (const char* str, char** endptr, int base);

 

- 파라미터

  • str : long 형식 값을 구할 문자열
  • endptr : 계산을 끝낸 위치를 저장할 문자열 포인터
  • base : 진수

- 리턴 값 : 계산된 long 형식 값

 

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    char src[100]="123 ff 16 1001 -10";
    char *pos=NULL;
    long value1=0,value2=0,value3=0,value4=0, value5=0;

    value1 = strtol(src,&pos,10); // 10진수로 계산
    value2 = strtol(pos,&pos,16); // 16진수로 계산
    value3 = strtol(pos,&pos,8); // 8진수로 계산
    value4 = strtol(pos,&pos,2); // 2진수로 계산
    value5 = strtol(pos,&pos,10); // 음수값 10진수로 계산
    
    printf("%ld %ld %ld %ld %ld\n",value1,value2,value3,value4, value5);
    
    return 0;
}

 

 

✔️ 만약 변환이 멈춘 위치를 굳이 획득할 필요가 없다면 두 번째 인자에 그냥 NULL을 전달하면 된다.

 

✔️ strtol의 세번째 인자인 base에 0을 전달하면 문자열 앞부분을 검사하여 자동으로 적절한 진수를 선택한다. (단, 0x, 0X, 0 접두사는 처리하나 0b 접두사는 처리하지 못한다.)

  • "0x1A" 또는 "0X1A": 16진수로 해석되어 값 26을 반환한다.
  • "075": 8진수로 해석되어 값 61을 반환한다.
  • "42": 10진수로 해석되어 값 42를 반환한다.

 

 

 

 

strtoul

 

strtoul 함수는 정수로 구성된 문자열 str을 세번째 파라미터인 진수체계로 판단하여 unsigned long 형식 값으로 반환한다. 더이상 계산할 수 없는 문자를 발견하면 두번째 파라미터인 endptr에 해당 위치를 저장한다.

 

#include <stdlib.h>
unsigned long strtoul(const char *nptr,char **endptr,int base);

- 파라미터

  • str : unsigned long 형식 값을 구할 문자열
  • endptr : 계산을 끝낸 위치를 저장할 문자열 포인터
  • base : 진수

- 리턴 값 : 계산된 unsigned  long 형식 값

 

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    char src[100] = "123 ff 16 1001 8A7B6C5D";
    char *pos = NULL;
    unsigned long value1 = 0, value2 = 0, value3 = 0, value4 = 0, value5 = 0;

    value1 = strtol(src, &pos, 10); // 10진수로 계산
    value2 = strtol(pos, &pos, 16); // 16진수로 계산
    value3 = strtol(pos, &pos, 8); // 8진수로 계산
    value4 = strtol(pos, &pos, 2); // 2진수로 계산
    value5 = strtol(pos, &pos, 16); // 16진수로 계산해서 16진수로 출력
    
    printf("%lu %lu %lu %lu %08lX\n", value1, value2, value3, value4, value5);

    return 0;
}

 

✔️ strtoul 함수는 문자열을 unsigned long 타입으로 변환하는 함수로 음수 값을 변환하려고 시도하는 경우 예상하지 못한 결과를 반환할 수 있으니 주의해야 한다.

 

이와 비슷한 기능으로 strtod, strtof, strtold, strtol, strtoll, strtoul, strtoull 함수가 존재한다.

 

string to double / float / long double / long / long long / unsigned long / unsigned long long 으로 구분하면 편하다.

 

 

 

출처  : https://ehpub.co.kr/strtol-%ED%95%A8%EC%88%98/