在 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;
调试器清楚地表明x
是L"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("")
宏,效果会更好。这种组合适用于 MBCS 和 UNICODE 构建。
【讨论】:
不清楚这就是他想要做的。他可能想要EditText
的第一个字母。 (这可能解释了反对意见。但我个人不会反对这个答案)。
这仅在 UI 使用 MFC 框架时有效。听起来 OP 正在使用普通的 Win32 API 调用。独立的GetWindowText()
函数不会填充CString
,而是填充TCHAR[]
缓冲区。
从原始帖子中完全不清楚他是否使用 MFC。所以我做了一个假设
_tcscmp
用于比较TCHAR
。如果WCHAR
正在使用,则函数为wcscmp
。
正确。只有一个补充:TCHAR 被定义为 WCHAR 并且 _tcscmp 在 UNICODE 构建的情况下变为 wcscmp。以上是关于在 if() 中比较 LPCWSTR的主要内容,如果未能解决你的问题,请参考以下文章