2010-03-24 3 views
2

vsnprintf()의 변형을 사용할 때 버퍼가 입력 버퍼보다 ​​길어서 사용자에게 오류가 발생하지 않을 수있는 방법을 찾고 있습니다.msvc2008에서 실패한 vsnprintf에서 graceflly 복구

은 지금까지 나는 vsnprintf() 및 그 변종이 자동으로 버퍼가 너무 작 문자열을 잘라하지만 그래서 난 더 이상 함께 다시 시도 할 수없는 문자열의 실제 길이을 반환하지 않는 것으로 나타났습니다 완충기. 그들은 -1을 반환합니다. 이 오류에 직면했을 때 다른 한편으로

vsnprintf_s() 변형, 차례로 결국 가능성에만 디버그, _CrtDbgReportW()를 호출

_VALIDATE_RETURN(("Buffer too small", 0), ERANGE, -1); 

를 호출합니다. 사용자가 제공 한 "잘못된 매개 변수 처리기"를 호출하기 전에도이 작업을 수행합니다.

원하는 것은 함수를 다시 할당하고 호출해야하는 실제 크기를 가져 와서 사용자 상호 작용없이 복구 할 수 있기를 원합니다. 그게 가능하니?

답변

2

을 당신이 찾고있는 기능은 _vscprintf (또는 _vscwprintf)입니다. 실제로 서식을 지정하지 않고 필요한 문자 수를 반환합니다.

0

출력 버퍼의 길이를 으로 입력하면 n 문자를 쓰지 않은 것입니다.

vsnprintf은 버퍼가 충분히 긴 경우 기록 될 문자 수를 반환합니다.

그래서 반환 값은 필요한 버퍼의 크기입니다.

n=0으로 설정하면 아무 것도 쓰이지 않지만, vsnprintf은 버퍼의 크기를 알려줍니다.

가 (난 그냥 vsnprintf 문서를 다시 읽어, 당신은 NUL의 반환 값에 1 바이트를 추가해야합니다.)

+0

(VC) vsnprintf는 데이터를 버퍼에 맞출 수없는 경우 -1을 반환합니다. – shoosh

+0

try _scprintf를 입력하십시오. 당신이 옳다는 것을 덧붙여 야합니다. VC 구현은 다릅니다. – philcolbourn

+0

완벽한 예제로 MS 문서 링크! http://msdn.microsoft.com/en-us/library/t32cf9tb(VS.80).aspx – philcolbourn