티스토리 뷰
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
파라미터 :
- 변환할 정수
- 변환받을 문자열을 저장할 문자열 변수
- 변환할 진수 (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;
}
출력결과
'C, C++ > C, C++' 카테고리의 다른 글
[goto문 에러] jump to label '%LABEL%' [-fpermissive] (0) | 2015.06.23 |
---|---|
atoi(), itoa() 함수에 대하여.. (8) | 2014.03.03 |
c언어 매크로 사용법 - 2. 가변인자 매크로 (0) | 2014.03.02 |
c언어 매크로 사용법 - #, ## 연산자 (2) | 2014.03.02 |
C언어 bsearch() - 이진탐색 함수 (0) | 2014.02.16 |
C언어 가변인자(가변파라미터)를 사용해보자 (7) | 2014.01.25 |
- TAG
- atof, atoi, atol, Atoll, char * int 변환, int char* 변환, itoa, ltoa, 문자열 정수형 변환, 정수형 문자열 변환
-
주로스 도움이 되었어요 수고하셨읍니다 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 신고
- Total
- 846,114
- Today
- 49
- Yesterday
- 277
- NgZone
- Rx.js
- 스위프트
- vim
- zone
- 챗봇
- 안시 컬러
- JavaScript
- 타입스크립트
- 리눅스 터미널 색상
- qemu linux arm
- 우분투 16.04
- ECMA2015
- git proxy
- QT
- observable
- itoa
- ansi color
- 안시 색상
- typeScript
- angular2
- ZONES
- Angular
- 폰트 조정
- terminal 색
- Swift
- lua table
- C언어
- Zone.js
- git 설정