Tuesday, May 22, 2007
C언어] sprintf_s 함수 사용법: 비주얼 Visual C 2005 이상에서
포맷 출력을 화면이 아닌 문자열로 저장할 때에는 sprintf() 함수를 사용합니다. 그런데 비주얼C 2005 버전에서는 보안이 강화된 sprintf_s() 함수를 사용하는 것이 좋습니다. 그렇지 않으면 컴파일러 설정에 따라, 다음과 같은 경고가 나올 수 있습니다.
sprintf_s 함수의 2번째 파라미터에 문자열 버퍼 크기를 지정해 주면 됩니다. 달라진 점은 그것뿐입니다. 다음 예제에서는 sizeof 연산자로 버퍼 크기를 자동으로 지정합니다.
소스 파일명: example.cpp
정태영님께서 지적해 주신 대로, 이번에는 상수를 사용하여 버퍼 크기를 직접 지정하였습니다.
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;
}
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;
}
#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++)
sizeof(buf) 는 char buf[80] 같은 static buffer 라면야 문제가 없겠지만, malloc 등으로 동적할당했다거나, 포인터를 통해 전해진 경우에는 제대로 동작하지 않습니다. :)
char buf[BUF_SIZE];
sprintf( buf, BUF_SIZE, ... 식으로 사용하는게 훨씬 나을 듯 싶습니다.
저의 귀차니즘 때문에 sizeof를 사용했습니다 ^^;
포인터로 전달된 경우에는 버퍼 크기가 항상 4바이트로 나와서 문제가 되니 이때는 상수로 버퍼 크기를 지정해야겠지요...
(∩_∩;)
<< Home