티스토리 뷰


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;
}

출력결과


댓글
  • 프로필사진 주로스 도움이 되었어요 수고하셨읍니다 2016.01.18 22:06 신고
  • 프로필사진 Outburst itoa함수가 비표준함수인건 처음 알았네요, 고맙습니다. 2017.03.19 18:37 신고
  • 프로필사진 123 문자열 string은 atoi로 int형으로는 안변하나요????? 2017.05.09 20:18 신고
  • 프로필사진 norux atoi함수는 char * 의 데이터를 int로 변환해주는 함수입니다.

    c++ 의 string class를 말씀하시는거라면,
    c_str() 함수의 사용을 통해서 string->char* 변환을 먼저 하셔야합니다.
    2017.05.10 15:25 신고
  • 프로필사진 나즈나 stdlib.h에 대해 표준 라이브러리 함수가 아니라 MS 표준 라이브러리 함수로 정정하는 것이 덜 모호할 것같습니다.
    VS에 포함된 stdlib.h는 상당 수 MS에서 손을 본 라이브러리이기에 MS의 표준이라고 명시하는 것이 비표준이 있음을 명확히 할 수 있을 것같습니다.
    2018.02.10 20:59 신고
  • 프로필사진 norux 의견 감사합니다. ^^

    저는 MS 표준이라는말이 입에 잘 와닿지가 않네요. 제가 이야기한 C언어에서의 표준이란 국제 표준화 기구(https://www.iso.org)에서 문서로 정의한 규격이었습니다. 규격의 이름은 C99/C11 이며, ISO/IEC 9899:2011라는 이름으로 찾을 수 있습니다. (C11 문서는 유료라.. C99문서 - http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf 306쪽에 stdlib.h 관련된 내용을 볼 수 있습니다.)

    따라서 C언어 표준(C99/C11) 규격문서에 정의되지 않은 itoa 함수는 '비표준' 함수라고 작성한 것입니다.

    의견주신것처럼 C99/C11 같은 규격의 이름을 명시하는것으로 수정하겠습니다. 감사합니다~
    2018.02.12 10:30 신고
  • 프로필사진 나즈나 다소 오해가 있었던 듯합니다.
    C99/C11 표준은 저도 숙지하고 있습니다.
    오히려 그렇기에 첫번째 줄의
    "우선 두 함수 모두 표준 라이브러리 헤더(stdlib.h)에 선언되어 있습니다."
    표현에 처음 배우는 사람들이 많이들 헷갈려 하더군요.
    대부분 첫줄과 중간 마지막만 보니까요.
    그래서 제가 제안한 부분은
    "우선 두 함수 모두 'MS의' 라이브러리 헤더(stdlib.h)에 선언되어 있습니다." 가 처음 배우는 사람에게는 분명한 표현이 되지 않을까 해서 의견 드렸습니다. 첫 줄만 봐서는 itoa도 표준이라고 들리고 수강생이 실제 이 블로그 포스팅을 보고 표준이지 않냐고 해서요..
    2018.02.12 10:59 신고
  • 프로필사진 norux 아하 그런말씀이셨군요~
    표준라이브러리라는 단어자체를 제외하고 바로 다음줄에 등장하는 itoa의 비표준관련 설명을 강조, 풀어쓰는것으로 수정하였습니다 ^^

    더 좋은 내용이 될 수 있도록 제안해주셔서 정말로 감사드립니다!
    2018.02.12 13:12 신고
댓글쓰기 폼