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 에 저장된다.