为什么我在消息框中收到象形文字文本

Why am I getting hieroglyphic text in message box

我正在使用 C++ 在我的 Win32 桌面应用程序上创建一个按钮,当按下该按钮时,会显示一个消息框,该消息框打印出文本框中的用户输入以及一些附加文本。但是,消息框显示带有象形文字的文本并给出错误 C6054:字符串 'buff' 可能不是零终止的。我不确定为什么文本没有正确显示在消息框中。

#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
    
#define ENTER_BUTTON                2345

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    TCHAR heading[] = _T("CD ROM READER");
    TCHAR CSCI_No_Inst[] = _T("Please enter the CSCI No below:");

    switch (message)
    {
    case WM_CREATE:
    {
        TextBox = CreateWindow(TEXT("EDIT"), TEXT(""),
            WS_VISIBLE | WS_CHILD | WS_BORDER,
            150, 140, 250, 25,
            hWnd, NULL, NULL, NULL); 

        HWND hwndButton_Enter = CreateWindow(
            L"BUTTON", L"ENTER", 
            WS_VISIBLE | WS_CHILD | WS_BORDER,  //Styles
            405, 140, 70, 25,
            hWnd, (HMENU)ENTER_BUTTON, NULL, NULL);
      return 0;
    }

     case WM_COMMAND:
    {
        switch (LOWORD(wParam))
        {
         case ENTER_BUTTON:
              
            int gwtstat = 0;
            TCHAR title[] = _T("CSCI_NO");
            gwtstat = GetWindowText(TextBox, &CSCI_NO[0], 60);
            
            TCHAR buff[100];
            TCHAR name[] = _T("CSCI_NO");
            _tprintf(buff, L"The CSCI No you entered is: %s", &CSCI_NO[0]);
            MessageBox(hWnd, buff, title, MB_OK);
            break;
        }
    }
}

首先需要初始化数组buff,否则输出时会出现未初始化字符乱码

那么你应该使用swprintf而不是_tprintfwprintf)将字符串输出到buff数组

我修改了代码如下,大家可以参考一下:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    TCHAR heading[] = _T("CD ROM READER");
    TCHAR CSCI_No_Inst[] = _T("Please enter the CSCI No below:");
    TCHAR CSCI_NO[60] = L"";
    switch (message)
    {
    case WM_CREATE:
    {
        TextBox = CreateWindow(TEXT("EDIT"), TEXT(""),
            WS_VISIBLE | WS_CHILD | WS_BORDER,
            150, 140, 250, 25,
            hWnd, NULL, NULL, NULL);

        HWND hwndButton_Enter = CreateWindow(
            L"BUTTON", L"ENTER",
            WS_VISIBLE | WS_CHILD | WS_BORDER,  //Styles
            405, 140, 70, 25,
            hWnd, (HMENU)ENTER_BUTTON, NULL, NULL);
        return 0;
    }

    case WM_COMMAND:
    {
        switch (LOWORD(wParam))
        {
        case ENTER_BUTTON:

            int gwtstat = 0;
            TCHAR title[] = _T("CSCI_NO");
            gwtstat = GetWindowText(TextBox, &CSCI_NO[0], 60);

            TCHAR buff[100] = L"";
            TCHAR name[] = _T("CSCI_NO");
            wsprintf(buff, L"The CSCI No you entered is: %s", CSCI_NO);
            MessageBox(hWnd, buff, title, MB_OK);
            break;
        }
        return 0;
    }
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
}

它对我有用: