在 if() 中比较 LPCWSTR

Posted

技术标签:

【中文标题】在 if() 中比较 LPCWSTR【英文标题】:Comparing LPCWSTR in if() 【发布时间】: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() 是错误的,我应该使用其他东西吗?

【问题讨论】:

***.com/questions/8004237/… 你是如何声明变量x的,你是如何初始化它的?从更大的角度来看,你想做什么? 【参考方案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。

以上是关于在 if() 中比较 LPCWSTR的主要内容,如果未能解决你的问题,请参考以下文章

在 if() 中比较 LPCWSTR

为啥我不能在“if”语句中与 '_' 字符进行比较? [关闭]

将 IF 条件与存储在变量中的比较运算符一起使用

Snowflake 程序中 IF 条件下的变量比较

在 Oracle 存储过程中比较 IF 语句中的两列

如何在 if 语句中显示/比较 mysql 行的动态值?