컴퓨터 엑셀 워드 포토샵 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Tuesday, May 22, 2007

C언어] sprintf_s 함수 사용법: 비주얼 Visual C 2005 이상에서


포맷 출력을 화면이 아닌 문자열로 저장할 때에는 sprintf() 함수를 사용합니다. 그런데 비주얼C 2005 버전에서는 보안이 강화된 sprintf_s() 함수를 사용하는 것이 좋습니다. 그렇지 않으면 컴파일러 설정에 따라, 다음과 같은 경고가 나올 수 있습니다.

sprintf_s.cpp(8) : warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. D:\Program Files\Microsoft Visual Studio\VC\include\stdio.h(345) : see declaration of 'sprintf'


sprintf_s 함수의 2번째 파라미터에 문자열 버퍼 크기를 지정해 주면 됩니다. 달라진 점은 그것뿐입니다. 다음 예제에서는 sizeof 연산자로 버퍼 크기를 자동으로 지정합니다.

보안 강화된 sprintf_s 함수 사용 예제


소스 파일명: example.cpp
#include <stdio.h>


int main(void) {
  char buf[80]; // 문자열이 저장될 버퍼


  float num = 1.234f;
  sprintf_s(buf, sizeof(buf), "문자 = %0.3f\n", num);

  printf("%s\n", buf);
  // 출력 결과: 문자 = 1.234


  return 0;
}





정태영님께서 지적해 주신 대로, 이번에는 상수를 사용하여 버퍼 크기를 직접 지정하였습니다.

#include <stdio.h>

#define BUF_SIZE 80

int main(void) {
  char buf[BUF_SIZE]; // 문자열이 저장될 버퍼

  float num = 1.234f;
  sprintf_s(buf, BUF_SIZE, "문자 = %0.3f\n", num);

  printf("%s\n", buf);
  // 출력 결과: 문자 = 1.234


  return 0;
}





tag: cpp
C언어 | C/C++ (Visual C++)

2 Comments:
At May 26, 2007 at 12:53 PM, Anonymous Anonymous said...

sizeof(buf) 는 char buf[80] 같은 static buffer 라면야 문제가 없겠지만, malloc 등으로 동적할당했다거나, 포인터를 통해 전해진 경우에는 제대로 동작하지 않습니다. :)

char buf[BUF_SIZE];
sprintf( buf, BUF_SIZE, ... 식으로 사용하는게 훨씬 나을 듯 싶습니다.

 
At May 26, 2007 at 2:09 PM, Blogger mwultong said...

저의 귀차니즘 때문에 sizeof를 사용했습니다 ^^;

포인터로 전달된 경우에는 버퍼 크기가 항상 4바이트로 나와서 문제가 되니 이때는 상수로 버퍼 크기를 지정해야겠지요...

(∩_∩;)

 

Post a Comment

<< Home RSS 2.0 feed

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.
블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면 RSS 2.0 feed 주소를 리더기에 등록하시면 됩니다.
Previous Posts
Monthly Archives
Top