티스토리 뷰


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
  • 파라미터:
    1. 버퍼 변수
    2. 포멧
    3. 가변 파라미터
  • 리턴값 : 문자열의 길이
  • 함수역할 : 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.04 gcc, g++ 최신 버전 설치하기

흠, 그럼 다시 12번째 줄을 봅시다. buf의 주소값에 len을 더해준 이유는 무엇일까요? 앞선 문자열의 길이만큼 더해주는 작업이 없었다면 계속 buf의 시작주소에다가 포멧을 입력하게되어서 버퍼를 덮어 쓰는 형태가 되었겠죠?


이해가 잘 안가시면 +len 을 제거하고 테스트 한 번 해보시길 바랍니다! 프로그래머에게는 언제나 실험정신이 중요하고 그로써 배웁니다 ㅎ_ㅎ


itoa같은 비표준함수는 이제 그만! 표준함수를 이용하도록 합시다 ㅎㅎㅎ


참고로 atoic표준함수입니다. string->int는 표준이면서 그 반대는 표준이 아니라는 것도 참 재밌죠?

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글
  • 프로필사진 지나가다 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 신고
댓글쓰기 폼
1 ... 26 27 28 29 30 31 32 33 34 ... 45