2017-09-18 18 views
0

다음 코드는 제대로 작동하지 않습니다. %i은 변수와 연결되지 않습니다.형식이 지정된 MessageBox 내에서 숫자를 인쇄 할 수 없습니다.

#include<Windows.h> 
#include<stdio.h> 
#include<tchar.h> 

/*  SCREENSIZE.C 

    This project contains the code that Programming Windows 
    book by Charles Petzold is using. 

*/ 


int cdecl MessageBoxPrintfW(TCHAR *msgBoxTitle, TCHAR *msgBoxFormat, ...) 
{ 
    //define buffer 
    TCHAR msgBoxBuffer[1024]; 

    //define iteration pointer 
    va_list argPtr; 

    //start iteration 
    va_start(argPtr, msgBoxFormat); 

    /*int _vsnwprintf_s(
    wchar_t *const _Buffer, 
    const size_t _BufferCount, 
    const size_t _MaxCount, 
    const wchar_t *const _Format, 
    va_list _ArgList) 
    */ 

    _vsntprintf_s(msgBoxBuffer, sizeof(msgBoxBuffer)/sizeof(TCHAR), (sizeof(msgBoxBuffer)/sizeof(TCHAR)) - 1, msgBoxFormat, argPtr); 

    //end iteration 
    va_end(argPtr); 

    //Use return type to pass preconfigured MessageBox(0,"Text","Title",MB_OKCANCEL); 
    //Whe we use L before a string example: L"text" it is considered UNICODE format. 

    return(MessageBox(0, msgBoxFormat, msgBoxTitle, MB_OKCANCEL)); 
} 

int WINAPI WinMain(
    HINSTANCE hInstance, 
    HINSTANCE hPrevInstance, 
    LPSTR pCmdLine, 
    int iCmdShow) 
{ 
    int cxScreen, cyScreen; 
    cxScreen = GetSystemMetrics(SM_CXSCREEN); 
    cyScreen = GetSystemMetrics(SM_CYSCREEN); 

    MessageBoxPrintfW(TEXT ("SCREENSIZE"), TEXT("The screen is %i pixels wide by %i pixels high."), cxScreen, cyScreen); 

    return(0); 
} 

왜 이런 일이 발생합니까? 다음은

내가 얻을 출력됩니다 : 당신이 msgBoxBuffer에을 writting된다

output

+2

delete[]의 사용

int MessageBoxPrintfW(const TCHAR *msgBoxTitle, const TCHAR* msgBoxFormat, ...) { va_list args; va_start(args, msgBoxFormat); int len = _vsctprintf(msgBoxFormat, args) + 1; // add terminating '\0' TCHAR *buf = new TCHAR[len]; _vstprintf_s(buf, len, msgBoxFormat, args); int result = MessageBox(0, buf, msgBoxTitle, MB_OKCANCEL); delete[]buf; return result; } 

버전 C하십시오. –

+1

그리고 원하는 것은 무엇입니까? 당신은'msgBoxBuffer'를 사용하지 않고'msgBoxFormat'을 대신 표시합니다. – RbMm

+0

편집을 도와 준 레미에게 감사드립니다. – strax

답변

2
TCHAR msgBoxBuffer[1024]; 
_vsntprintf_s(msgBoxBuffer,... 
... 
return(MessageBox(0, msgBoxFormat, msgBoxTitle, MB_OKCANCEL)); 

참고,하지만 당신은 msgBoxBuffer를 사용하지 않습니다. 따라서 메시지 상자는 아무 것도 변경하지 않습니다. 다음 대신보십시오 : new 대신 malloc(len * sizeof(TCHAR))를 사용하고, 당신은 형식이 아닌 버퍼를 표시하는 free 대신

+0

당신은 올바른 사람입니다. 나는 혼란스럽고 실제 버퍼 대신 매개 변수의 이름을 썼는데, 그때 나는 그것을 볼 수 없었습니다. 나는이 감추기가 옳았다는 것을 당연시했습니다. – strax

+1

'새로운 TCHAR []'을 사용하려고한다면'std :: vector '또는'std :: basic_string '을 사용하는 것이 더 좋을 것입니다. 그렇다면'delete [ ]'수동으로. 반면에이 코드는'.C' 파일 확장자를 가진 파일에 있으므로 아마 C++ 대신 C를 사용합니다. –

+0

당신은 Remy입니다. C++을 잘 모릅니다. 나는 C를 어느 정도 학위 취득 할 때까지 사용하고 싶지 않습니다. 그래서 모든 것을 가능한 한 순수한 C로 유지하려고 노력합니다. 나는 내가 있어야한다고 생각합니다. C로 매우 편한 다음 C++로 이동하십시오 ... 적어도 그것이 어떻게 느껴지나요. – strax