【问题标题】:Comparing LPCWSTR in if()在 if() 中比较 LPCWSTR
【发布时间】:2015-03-27 21:26:38
【问题描述】:

我觉得我在这里遗漏了一些非常明显的东西......

在我的程序中,我使用 GetWindowText() 从编辑框中读取用户输入,
后跟这段代码:

if (x == L"R" || x == L"C" || x == L"L"){ n = 1; }
else{ n = 9; }

调试器清楚地表明xL"R",但n 被设置为9。

在这种情况下使用if() 是错误的,我应该使用其他东西吗?

【问题讨论】:

标签: c++ winapi visual-c++


【解决方案1】:

x 是一个wchar* 指针。调试器足够聪明,可以向您显示x 指向的数据。实际数据在内存中的其他地方。

L"R" 和其他值是字符串文字。它们被实现为指向存储在您应用的只读数据段中的wchar_t[] 数组的指针。

您的if 语句将指针与指针进行比较,如果它们未指向同一内存(在这种情况下,它们不指向),则会失败。要比较实际指向的数据,需要使用lstrcmpW()或类似函数,例如:

if ((lstrcmpW(x, L"R") == 0) ||
    (lstrcmpW(x, L"C") == 0) ||
    (lstrcmpW(x, L"L") == 0))
{
    n = 1;
}
else
{
    n = 9;
}

【讨论】:

    【解决方案2】:

    我建议使用 CString(在 UNICODE 构建中变为 CStringW)而不是 LPCWSTR(如果使用 MFC)。它确实有operator==()

    CString str;
    m_DataEdit.GetWindowText(str);
    
    if (str == _T("R") || str == _T("C") || str == _T("L"))
    { 
      n = 1; 
    }        
    else
    { 
      n = 9; 
    }
    

    LPCWSTR 只是const WCHAR* 的定义。所以你应该使用wcscmp 函数进行比较。如果您使用LPCTSTR_tcscmp()_T("") 宏,效果会更好。这种组合适用于 MBCSUNICODE 构建。

    【讨论】:

    • 不清楚这就是他想要做的。他可能想要EditText 的第一个字母。 (这可能解释了反对意见。但我个人不会反对这个答案)。
    • 这仅在 UI 使用 MFC 框架时有效。听起来 OP 正在使用普通的 Win32 API 调用。独立的GetWindowText() 函数不会填充CString,而是填充TCHAR[] 缓冲区。
    • 从原始帖子中完全不清楚他是否使用 MFC。所以我做了一个假设
    • _tcscmp 用于比较TCHAR。如果WCHAR正在使用,则函数为wcscmp
    • 正确。只有一个补充:TCHAR 被定义为 WCHAR 并且 _tcscmp 在 UNICODE 构建的情况下变为 wcscmp。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2020-08-01
    • 2017-01-04
    • 2013-12-02
    • 2020-07-01
    • 2020-05-28
    相关资源
    最近更新 更多