프로그래밍/델파이

Format와 wvsprintf

채윤아빠 2009. 12. 16. 00:45
728x90
반응형
델파이에서 문자열을 포맷팅하는 데 Format 함수를 사용하게 되는데, 숫자를 포맷팅하는 경우에 0으로 남은 문자를 채우는 기능이 아쉬울 경우가 많습니다. C 함수의 printf로 보자면, "%02d"는 Delphi의 Format로는 적용이 안됩니다.
윈도우에서 제공하는 wvsprintf 함수를 이용하면 이 문제를 해결할 수 있습니다. wsprintf도 비슷하게 해결할 수 있지만, 델파이의 Windows 유닛에 wsprintf 함수의 선언이 잘못되어 있어서 그대로는 사용이 불가능합니다.

아래는 시각을 표시하기 위하여 Format 함수를 이용하는 방법과 wvsprint 함수를 사용하는 예제코드입니다.
procedure TForm1.Button1Click(Sender: TObject);
var
  strTime: string;
begin
  strTime := Format('%02d:%02d:%02d', [12, 3, 0]);
  ShowMessage(strTime);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  szBuf: array[0..255] of char;
  arrArg: array[0..2] of Pointer;
begin
  arrArg[0] := Pointer(12);
  arrArg[1] := Pointer(3);
  arrArg[2] := Pointer(0);

  wvsprintf(szBuf, '%02d:%02d:%02d', @arrArg);
  ShowMessage(szBuf);
end;

Format를 이용한 결과는 다음과 같습니다.


wvsprintf를 이용한 결과는 다음과 같습니다.


위와 같이 Format 함수로 부족한 부분은 불편하지만, wvsprintf를 이용할 수도 있겠지만, wvsprintf 함수 자체가 스택 오버플로우 취약점을 가지고 있다는 점을 유념하고 사용해야 합니다. 보안상 취약점이 생길 수 있으니 버퍼 및 매개변수 관리를 잘해 주어야 합니다.