首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 字串比較陷阱:指標比較 vs strcmp,LPCSTR 強轉無法比較內容

     編輯:程式設計疑難解答

錯誤代碼

if (LPCSTR(取程序類名(hwnd)) == LPCSTR("CalcFrame"))  // ❌ 比較指標位址,非字串內容

原因

  • 取程序類名 回傳區域陣列 TCHAR 類名[255] 退化為指標,每次呼叫位址不同。
  • LPCSTR("CalcFrame") 是字面值常數區位址。
  • == 比較的是**兩個指標的記憶體位址**,永遠為 false。

正確比較方法

C 風格:strcmp / _tcscmp

#include <tchar.h> // _tcscmp 自動對應 ANSI/Unicode
if (_tcscmp(取程序類名(hwnd), _T("CalcFrame")) == 0) {
    // 相等
}

C++ 風格:std::string / std::wstring

std::wstring className = 取程序類名(hwnd); // 需修改回傳型別為 std::wstring
if (className == L"CalcFrame") { ... }

MFC/ATL:CString

CString className = 取程序類名(hwnd);
if (className == _T("CalcFrame")) { ... } // CString 多載 == 比較內容

修正後的完整主迴圈

int _tmain(int argc, _TCHAR* argv[]) {
    HWND hwnd;
    while (true) {
        hwnd = GetForegroundWindow();
        CString className = GetWindowClassName(hwnd); // 回傳 CString
        _tprintf(_T("類名: %s\n"), className.GetString());
        
        if (className == _T("CalcFrame")) {
            MessageBox(NULL, _T("真"), _T("真"), MB_OK);
        } else {
            MessageBox(NULL, _T("假"), _T("假"), MB_OK);
        }
        Sleep(500); // 避免佔滿 CPU
    }
    return 0;
}

CString GetWindowClassName(HWND hwnd) {
    TCHAR buf[256];
    GetClassName(hwnd, buf, 256);
    return CString(buf);
}

關鍵原則

  1. **C 風格字串 (char*/wchar_t*) 必須用 strcmp/_tcscmp/wcscmp 比較內容**。
  2. **C++ 應優先使用 std::string/std::wstring/CString**,直接支援 == 內容比較。
  3. 不要對指標做 == 期望比較字串內容。

總結

LPCSTR(...) == LPCSTR("...") 比較的是指標位址,非字串內容。請用 _tcscmp (TCHAR 通用) 或改用 CString/std::wstring 直接用 == 比較。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved