문자열에서 정수값을 구하는 함수에는 여러 개가 있습니다. 정수 문자열일 경우 atoi()와 strtol() 함수를 사용하고 실수까지 처리해야 한다면 strtod(), strtof()를 사용합니다. 정수와 실수를 모두 처리하려면 sscanf()를 사용하면 편리합니다. 이번에 소개하는 함수는 atoi()와 strtol()함수를 이용하여 8진수, 10진수, 16진수 문자열을 처리합니다.

/** ----------------------------------------------------------------------------
@brief  문자열을 10진수로 변경
@remark 0x로 시작하는 문자열은 16진수로, 0으로 시작하는 문자열은 8진수로 변환
@param
@return 숫자로 변경할 수 없는 문자열일 경우 0을 반환
 -----------------------------------------------------------------------------*/
int  str_to_digit( char *a_str){

    char    *p_temp;
    int      n_result;

    if ( 0 == strncasecmp( a_str, "0x", 2)){
        n_result = strtol( a_str+2, &p_temp, 16);
    } else if ( '0' == *a_str){
        n_result = strtol( a_str+1, &p_temp,  8);
    } else {
        n_result = atoi( a_str);
    }

    return n_result;
}

int main( void){

    printf( "%s = %d\n", "0xff"   , str_to_digit( "0xff"     ) );
    printf( "%s = %d\n", "ff"     , str_to_digit( "ff"       ) );
    printf( "%s = %d\n", "010"    , str_to_digit( "010"      ) );
    printf( "%s = %d\n", "255"    , str_to_digit( "255"      ) );
    printf( "%s = %d\n", "255.255", str_to_digit( "255.255"  ) );

    return 0;
}

sscanf()를 사용하면 간단할 것을 왜 이렇게 함수를 만들었을까요? 그것은 접두어를 추가해서 다양한 진수를 사용할 수 있기 때문입니다. b01010101 같은 경우 말이죠. 숫자 문자열을 처리하실 때 참고하세요.