在 if() 中比较 LPCWSTR
Comparing LPCWSTR in if()
我觉得我在这里遗漏了一些非常明显的东西...
在我的程序中,我使用 GetWindowText()
、
从编辑框中读取用户输入
后跟此代码:
if (x == L"R" || x == L"C" || x == L"L"){ n = 1; }
else{ n = 9; }
调试器清楚地表明 x
是 L"R"
,但是 n
被设置为 9。
在这种情况下使用 if()
是错误的吗?我应该使用其他东西吗?
我建议使用 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 build.
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;
}
我觉得我在这里遗漏了一些非常明显的东西...
在我的程序中,我使用 GetWindowText()
、
从编辑框中读取用户输入
后跟此代码:
if (x == L"R" || x == L"C" || x == L"L"){ n = 1; }
else{ n = 9; }
调试器清楚地表明 x
是 L"R"
,但是 n
被设置为 9。
在这种情况下使用 if()
是错误的吗?我应该使用其他东西吗?
我建议使用 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 build.
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;
}