[C언어] atoi() , atol() , atof() , strtol() , strtoul() , strtod()
COM2008. 7. 8. 19:41 |Converting Strings to Numbers.
ato...() 와 strto...() 부류의 함수들은 문자열을 값으로 변화하기 위해 사용된다. 헤더는 stdlib.h 이다.
a 는 alpha(또는 ascii) 를 나타내고, str 은 string 을 나타낸다. strto...() 부류는 ato...() 부류에 비해 더 많은 제어와 오류검색을 제공한다.
ato...() 부류
atoi()
오래전부터 정말 많이 쓰이던 함수로, 일명 아토이 함수라고도 불린다. 보통은 a to i 라고 읽는다. i 는 integer를 나타낸다. 문자열을 정수로 변환한다.
int atoi(const char* );
숫자가 아닌 문자들은 delimiter로 작용한다. 따라서 초반에 숫자 아닌 문자가 오면 변환이 안된다. 변환이 안될경우 0 을 리턴한다. 단, 문자열 초반의 whitespace 에 대해서는 무시한다.
예.
#include<stdio.h>
#include<stdlib.h>
int main(void) {
char str[30];
scanf("%s",str);
printf("%d\n",atoi(str));
return 0;
}
atol()
atoi() 와 같은데, 다만 변환이 long 형이다.
long atol(const char* );
atof()
이것은 floating-point 특히, double형으로 변환한다. period (.) 도 소숫점으로 인식한다.
double atof(const char* );
다음은 위의 예제 코드와 동일하되, %d 대신 %lf 를 , atoi 대신, atof 를 쓴것이다.
---------------------------------------------------------------------------------------------------------------------
strto...() 부류
strtol()
문자열을 long 형으로 변환하고 리턴한다.
long strtol(const char* , char** , int );
첫번째 인자는 변환할 대상 문자열이다.
두번째 인자는 변환이 멈춘 지점의 "포인터의 주소"를 넘겨줄 대상이다. 즉, char** 형 변수가 와야한다. 이것을 NULL 로 설정하면, 멈춘 지점부터 시작하는 문자열을 아무곳에도 저장하지 않는다.
세번째 인자는 기수법의 밑(base)이다. 2부터 36 까지의 값을 갖는다.
이값은 변환할 문자의 범위를 지정하는 것으로, 가령 2 라고 하면, 문자열을 2진법으로 받아들여서 변환한다. 따라서, 0 과 1 만 변환을 수행하고 나머지는 delimiter 가 된다. 또 밑이 10 을 넘는 경우에는... A (또는 a ) 는 10 , B (또는 b ) 는 11 , ... , Z (또는 z) 는 35 과 같은 식으로 변환한다. 이때, 밑에 따라서 받아들이는 값도 그 진법에 맞게 해석된다. 따라서 변환된 값을 10진법으로 출력할 경우, 입력한 스트림과 다른 값이 나오게 된다.
특히, base를 0 으로 설정하면, 입력한 스트림의 첫부분에 의해 베이스를 8, 16, 10 으로 유연하게 적용할 수 있다. 첫부분이 0x ( 또는 0X ) 이면, base를 16 으로 해석한다. 첫부분이 0x 는 아니면서 0 이면, base를 8 로 해석한다. 나머지 경우는 base 10 으로 해석한다.
오버플로우 발생시, LONG_VAL 이나 -LONG_VAL 을 리턴하고, ERANGE 가 errno 에 저장된다.
예.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void) {
int base; long converted; unsigned i; char str[30] , *stop;
printf("Input a string starting with a positive integer : "); scanf("%s",str);
printf("Input the base ( 2 ~ 36 ): "); scanf("%d",&base);
converted = strtol(str,&stop,base);
for(i=0;i<(strlen(str)-strlen(stop));i++)
printf("%c",str[i]);
printf(" (%d)\t->\t%li (10)\n",base,converted);
return 0;
}
실행화면.
참고로 오류처리 부분만 제외하면... atol(str) 는 strtol ( str , NULL , 10 ) 와 같고,
atoi(str) 는 (int) strtol ( str , NULL , 10 ) 와 같다.
strtoul()
이것은 strtol() 과 유사하지만, unsigned long 을 리턴한다. 오버플로가 발생되면, ULONG_VAL 이나 -ULONG_VAL 이 리턴된다.
unsigned long strtol(const char* , char** , int );
strtod()
이것은 문자열을 double 로 변환한다. 첫번째 인자와 두번째 인자의 의미는 strtol() 과 같다.
double strtod( const char* , char** );
오버플로우가 발생되면, HUGE_VAL 이나 -HUGE_VAL 이 리턴되고, 언더플로가 발생되면 0 이 리턴된다. 두경우 모두 ERANGE가 errno 에 저장된다.