sprintf 와 wsprintf 이야기

from Study/API 2007/09/11 20:23 view 71327
귓동냥으로 wsprintf()의 w가 windows라는것을 알았기 때문에, 윈도우즈에서 프로그래밍할때에는 막연히 wsprintf()를 썼었는데, 오늘 관련 자료를 찾아보면서 보다 정확히 알게 되었다.

간략하게 정리하면
sprintf()는 CRT 라이브러리를 사용하는 함수
wsprintf()는 플랫폼 SDK에서 제공하는 함수, 단 실수(float)형의 사용은 안된다.
/////////////////////////////////////////////////////////////////////////////////////////////
sprintf 를 사용하려면  #include <stdio.h> 가 필요합니다.

이는 보통
#include <vcl.h>
#include <stdio.h>
#pragma hdrstop 식으로 쓰이게 되죠.

그런데 왜 vcl에서는 sprintf 를 포함하지 않았는지 궁금했었는데... wsprintf 가 있기 때문이었습니다.

wsprintf 는
#include <stdio.h>
없이 사용가능한 WIN32 API 로,  일반 ANSI코드과 유니코드 사용 프로그램에
공히 사용할수 있는 문자열 합성 함수입니다.

유니코드를 사용하지 않는 프로그램이면 그냥 wsprintf 를 sprintf 대신 사용하면 됩니다.
유니코드를 사용하는 프로그램이면 역시 wsprintf 를 그냥 사용하면 됩니다.

유니코드를 사용할 경우는 문자열은 L"문자열"; 식으로 유니코드로 표현되어야 하며
char * 대신 wchat_t *  형이 사용되어야 합니다.

그래서 표준적으로 유니코드 사용프로그램과 일반 프로그램에 공히 하나의 코드로 처리하기 위해
컴파일러는 TCHAR 형과 TEXT 매크로를 제공합니다.

가령 OnCreate 이벤트에 다음과 같은 코딩이 가능합니다.
{
TCHAR  buf[100];
wsprintf(buf, TEXT("캡션 메시지: %s"), TEXT("안녕하세요. C++빌더입니다."));
Caption = buf;
}
이 코드는 ANSI형이나 유니코드형 프로그램 양쪽에서 안전하게 동작합니다.
TEXT 매크로 와 __TEXT 매크로는 동일합니다.

Project Option->Directorys...->Conditional defines ; 에 UNICODE 또는 _UNICODE 를 넣어주면
유니코드모드로 컴파일하게 되는데, 이 경우 안전하게 유니코드모드로 컴파일되게 합니다.

프로그래밍할때 아예 습관을 char 대신 TCHAR 으로 하고
"문자열" 대신 TEXT("문자열") 을 쓰는 것도 좋을 것입니다.
Tag | ,

Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다

댓글을 달아 주세요

  1. Minorlife 2018/12/31 18:36  address  modify / delete  reply

    오래된 글이지만.. 저같이 궁금하신 분이 있을까봐 ㅎㅎ추가 도움 자료를 링크로 남겨봅니다..https://stackoverflow.com/questions/18196232/should-i-use-wsprintf-to-print-a-double-as-a-wide-stringSO링크입니다.1. Windows의 w 맞습니다.2. wsprintfA , wsprintfW 로 유니코드 대응합니다.3. 16비트 시스템에서 와이드 문자를 지원하기 위한 비표준 함수입니다.* (jerry coffin, 링크)세월이 흐른 지금은 그냥 swprintf 쓰시면 됩니다...^^