티스토리 뷰


atoi(), itoa() 함수에 대하여..

블로그 유입로그를 보다보니 위의 함수에 관련된 유입이 많아서 위 함수에 관련된 포스팅을 합니다. 이 함수들은 stdlib.h 파일에 선언되어 있습니다.


다만, itoa 함수의 경우 비 표준함수입니다. C99/C11규격에서 정의되지 않고, MS 컴파일러에서만 이용가능한 함수입니다. 즉, Linux/macOS 등 비 마이크로소프트 운영체제(컴파일러)에서는 stdlib.h 헤더파일을 include 한다고 해도 itoa 함수를 사용하지 못합니다. 따라서 저는 itoa함수 대신에 다른 방법으로 문자열 전환을 권유해 드렸습니다.


c/c++ sprintf, snprintf 함수 - 해당 포스팅을 보고 싶으시면 이곳을 클릭하세요

1. 문자열을 정수형으로 변환

이때 사용하는 함수가 atoi함수 입니다.

int atoi (const char* str);
  • 필요 헤더 : stdlib.h
  • 파라미터 : 문자열.
  • 반환값 : 숫자로 변환된 값 (ex. "5000" 이라는 문자열을 파라미터로 넣으면 5000이라는 정수가 리턴됨.)
  • 기타 : C 표준 함수 (C99/C11)

프로토 타입은 위와 같습니다. atoi와 친구같은 아이들도 몇명 있습니다.

double atof (const char* str);
long atol (const char* str);
long long atoll (const char* str);

각 함수의 반환형을 보시면 문자열을 어떤 타입으로 바꿔주는지 알 수 있습니다.


atof는 문자열을 배정도형으로 바꿔주는 함수이며, atol은 문자열을 long 형으로 바꿔주고, atoll은 문자열을 long long 형으로 바꿔줍니다.


위키 문서를 잠시 뒤적거린 결과, 위의 함수 모두 C 표준함수 입니다. atoll 의 경우 C99 아래 표준함수 이지만,, atoll정도는 웬만한 컴파일러에서는 다 허용 되지 않을까 생각합니다. (C99의 경우 C++ 개발이후 나온 표준이라는 것 때문에 C99 라이브러리일 경우 C++ 컴파일러에서 사용하지 못하는 경우가 '간혹' 있다고 합니다.)

2. 정수형를 문자열로 변환

자 이제 이것이 문제가 되는 함수인데요.

char * itoa(int val, char * buf, int radix);
  • 필요 헤더 : stdlib,h

  • 파라미터 :

    1. 변환할 정수
    2. 변환받을 문자열을 저장할 문자열 변수
    3. 변환할 진수 (10을 입력하면 10진수, 2를 입력하면 2진수)
  • 반환값 : 변환된 문자열의 주소 (2번째 파라미터인 buf의 주소)

  • 기타 : 비표준함수 (마이크로소프트 VS에서만 이용 가능)

itoa는 마이크로소프트 비주얼스튜디오에서만 정의해놓은 함수입니다. 따라서 우분투 등 다른 플랫폼에서 개발하시는 분은 사용하실 수가 없었을 겁니다.

그래서 전 itoa 함수 대신에 sprintf를 사용하는 것을 권장드립니다! (글 서두에 연결된 링크를 참조하시길 바랍니다.)


비주얼 스튜디오에서 위 함수의 친구도 있기는 합니다.

char * ltoa (long val, char * buf, int radix);

보시면 아시겠지만 long 형을 문자열로 바꿔주는 함수입니다.


아쉽게도 ftoa 같은 함수는 존재하지 않습니다.


(사실 fcvt라는 함수가 존재 하기는 합니다. 또한 이 함수는 표준인것처럼 보입니다.-자세히 알아보지 않아서 확실하지는 않지만 우분투에서도 사용가능한 함수- 하지만 사용법도 복잡하고, 이런 남들도 잘 쓰지 않는 복잡한 함수를 사용하느니, sprintf가 훨씬 간단하고 단순하기에 추천을 드리는 바입니다. 이 함수의 설명에 대해서는 생략하도록 하겠습니다.)


예제코드 하나 띄워드리고 마무리짓도록 하겠습니다.

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

int main()
{
    int a = 5;
    double b = 5.5;
    char str[10] = "1000";
    char tmp[10] = {0,};

    printf("a+str = %d\n", a + atoi(str));    // 문자열 -> 정수형 변환
    printf("b+str = %.2lf\n", b + atof(str));  // 문자열 -> 실수형 변환

    strcat(str, itoa(a,tmp,10));    // 정수형 -> 문자열 변환
    printf("%s\n", str);

    return 0;
}

출력결과


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함