티스토리 뷰
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/c++ sprintf, snprintf 함수 (13) | 2014.01.21 |
C언어 qsort() 함수 (6) | 2014.01.02 |
배열의 개수를 세는 _countof 매크로 (0) | 2013.12.31 |
c언어 - 함수포인터 (Function pointer) (32) | 2013.12.30 |
-
지나가다 sprintf 짱짱 2015.04.03 15:27
-
지나가다봄 Visual Studio 2015 에 실행할 수 있도록 다시 예제를 만드셔야 합니다. sprinf 함수는 이제 쓰이지 않습니다 2016.12.09 15:38
-
norux VS 에서만 sprintf 가 deprecated 되었습니다. gcc/LLVM 컴파일러에서는 아무 문제 없이 사용 가능합니다.
(다음 포스팅을 참조하면 VS에서도 사용 가능할 것으로 생각됩니다. http://norux.me/7)
예제는 VS에서 작성했지만, 되도록 리눅스 표준을 추구하므로 코드 수정은 하지 않겠습니다.
댓글 감사합니다! 2016.12.13 09:43 신고 -
void 설명이 잘되어있네요! sprintf 부분만 부분발췌해도 될까요? 출처는 남기겠습니다. 2017.11.10 15:04 신고
-
norux 네 문제없습니다. 감사합니다. ^^ 2017.11.10 16:37 신고
-
달달한사탕 sprint 첫째 입력파라미터가 char* 형인데 위에 코드예제에서는 but+len 으로 char 랑 int 가 섞여있네요. 이부분좀 설명부탁드려요 2018.01.24 08:17
-
norux 포인터의 덧셈 연산에 대해 조금 공부해보시는게 좋을 것 같습니다! (여기서 자세한 설명은 생략하겠습니다.)
char* 포인터 변수에 현재 문자열의 길이를 더함으로써, 계속 제일 끝에다 문자를 붙여넣기 하는 형태가 됩니다.
만약 + len 이 생략되면, 마지막for문의 4와 앞서 담아두었던 버퍼의 내용이 합쳐져서 4ello, 가 될것입니다.
2018.01.24 10:49 신고 -
달달한사탕 오오 답변감사드립니다 포인터 덧셈연산을 조금 공부해봐야겠네요 !!
항상 블로그보면서 도움많이 받습니다 감사합니다!! 2018.01.24 13:07 -
달달한사탕 아 이제야 이해했네요... buff 주솟값에 char type 은 1byte 차지하니... 앞선 스트링 길이많큼 이동시켜서 앞부분을 유지시키고 새로 계속 추가시킨거였군요..
감사합니다 2018.01.24 13:12 -
타전공중생 정말 감사합니다 ㅠㅠ 2018.02.12 13:02
-
윈플 "만약 + len 이 생략되면, 마지막for문의 4와 앞서 담아두었던 버퍼의 내용이 합쳐져서 4ello, 가 될것입니다."
직접 해본 결과 새로 쓰여져서 '4' 출력이 됩니다. sprintf, snprintf 모두 '버퍼 변수'에 문자열을 복사 후 마지막에 null을 붙이기 때문입니다.
좋은 예제 덕분에 저도 공부하다 찾은 내용이어서 공유합니다. 2018.08.16 11:20 -
만학도 좋은 글에 좋은 댓글이네요 감사합니다!
2020.02.26 21:00 -
alinew 좋은 예제와 친절한 설명 감사합니다. 덕분에 큰 도움을 받았네요 :) 2019.03.29 22:31
- Total
- 846,114
- Today
- 49
- Yesterday
- 277
- Angular
- JavaScript
- 스위프트
- ansi color
- 안시 색상
- itoa
- ZONES
- angular2
- git 설정
- 우분투 16.04
- C언어
- QT
- NgZone
- Rx.js
- Zone.js
- zone
- vim
- observable
- 리눅스 터미널 색상
- qemu linux arm
- typeScript
- 폰트 조정
- 타입스크립트
- lua table
- 안시 컬러
- git proxy
- ECMA2015
- Swift
- 챗봇
- terminal 색