티스토리 뷰
c/c++ sprintf, snprintf 함수
sprintf라는 출력함수가 있습니다.
이 함수는 printf와 비슷하게 사용되지만, 다른점은 printf는 모니터 화면에 입력한 문자열이 출력된다면, sprintf는 버퍼로 사용될 변수로 출력이 됩니다.
즉, char * 로 선언된 변수안에 입력된 내용이 문자열로써 담기게 되는 것이죠.
snprintf는 2번째 파라미터로 size가 추가된 함수로, 버퍼 오버플로우를 막기위해 문자열의 길이를 지정하는 좀 더 안전한 함수가 되겠습니다.
우선 함수의 프로토타입을 먼저 보도록 하겠습니다.
int sprintf (char *buffer, const char *format, ...)
int snprintf (char *buffer, int buf_size, const char *format, ...)
- 함수명: sprintf
- 필요헤더: stdio.h
- 리턴타입: int
- 파라미터:
- 버퍼 변수
- 포멧
- 가변 파라미터
- 리턴값 : 문자열의 길이
- 함수역할 : buffer 변수에 형식에 따라 만들어진 문자열이 저장된다.
... 은 오타가 아닙니다. C언어의 문법 중 하나로써 가변 파라미터를 가진다는 의미입니다.
간단히 설명을 하자면 "..." 에 해당하는 3번째 파라미터 부분에 파라미터가 아예 없어도 되고 또는 파라미터가 여러개가 되도 함수가 받을 수 있게끔 만들어진 것입니다.
가변 파라미터에 관한 포스팅을 보고 싶으시면 이곳을 클릭 하세요
sprintf에 대한 다음의 예제를 한 번 보시겠습니다.
#include <stdio.h>
int main(int argc, char** argv)
{
char buf[256];
int len;
int i;
len = sprintf(buf, "Hello,\n");
for (i=0; i<5; i++)
len += sprintf(buf + len, "%d ",i);
puts(buf);
//printf("%s\n", buf);
}
마지막의 puts은 아래 주석처리된 것과 같은 의미입니다. 엔터키 하나를 포함해서 화면에 출력해주는 함수입니다.
먼저 결과값은 이렇습니다.
sprintf를 사용하는 이유 중 하나는 12번째 줄에 표시된 것처럼 int형의 정수를 쉽게 char * , 스트링형식으로 전환할 수 있습니다. int형을 string으로 전환해주는 함수중에 흔히들 쓰시는건 to_string이나 itoa 같은 함수가 있는 것으로 압니다.
근데 우선 itoa는 표준함수가 아닙니다. 멀티플랫폼 개발을 하시는 분들은 사용해서는 안되는 함수인 것이죠.
또한 to_string 같은 함수는 c++11 컴파일러가 지원하는 함수여서 순수 c언어에선 사용할 수 없는 함수입니다. (c++에서 진짜 string이라는 클래스로 변환해주는 함수죠)
또한 참고로 c++ 컴파일러보다 높은 버전인 c++11 컴파일러(2011년 8월에 승인된 아주아주 최신버전) 여서 우분투에서 g++로 to_string을 사용하기 위해선 -std=c++11 이라는 옵션을 주어야 합니다.
$ g++ -std=c++11 [소스코드.cpp]
추가사항 2014.03.19
위의 옵션을 사용하기 위해서는 컴파일러 역시 최신버전이여야합니다. (g++버전이 4.7이상)
위 옵션이 정상동작하지 않는다면,
$ g++ --version
명령을 통해 g++을 확인해 보시길 바랍니다.
g++ 컴파일러를 최신버전으로 설치하는 방법은 아래 포스팅을 확인해주시길 바랍니다.
흠, 그럼 다시 12번째 줄을 봅시다. buf의 주소값에 len을 더해준 이유는 무엇일까요? 앞선 문자열의 길이만큼 더해주는 작업이 없었다면 계속 buf의 시작주소에다가 포멧을 입력하게되어서 버퍼를 덮어 쓰는 형태가 되었겠죠?
이해가 잘 안가시면 +len 을 제거하고 테스트 한 번 해보시길 바랍니다!
프로그래머에게는 언제나 실험정신이 중요하고 그로써 배웁니다 ㅎ_ㅎ
itoa같은 비표준함수는 이제 그만! 표준함수를 이용하도록 합시다 ㅎㅎㅎ
참고로 atoi는 c표준함수입니다. string->int는 표준이면서 그 반대는 표준이 아니라는 것도 참 재밌죠?
'C, C++ > C, C++' 카테고리의 다른 글
C언어 bsearch() - 이진탐색 함수 (0) | 2014.02.16 |
---|---|
C언어 가변인자(가변파라미터)를 사용해보자 (7) | 2014.01.25 |
C언어 qsort() 함수 (6) | 2014.01.02 |
배열의 개수를 세는 _countof 매크로 (0) | 2013.12.31 |
c언어 - 함수포인터 (Function pointer) (32) | 2013.12.30 |
- Total
- Today
- Yesterday
- ZONES
- NgZone
- Zone.js
- qemu linux arm
- Angular
- JavaScript
- vim
- 안시 컬러
- typeScript
- lua table
- git 설정
- QT
- terminal 색
- ECMA2015
- observable
- 폰트 조정
- Rx.js
- C언어
- 타입스크립트
- ansi color
- git proxy
- zone
- 우분투 16.04
- 리눅스 터미널 색상
- Swift
- 스위프트
- angular2
- itoa
- 안시 색상
- 챗봇
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |