我有以下代码:
LPCTSTR strPermission = Method();
if (strPermission == L"0")
{
return true;
}
else
{
return false;
}
在调试时,我可以看到 strPermission 确实等于"0",但是当我像在 if 语句中那样比较它时,它总是返回 false。
我唯一能想到的是它比较变量的内存地址而不是变量值。
如何将 strPermission 与 L"0" 进行比较,以便在 strPermission 等于 "0" 时返回 true。
谢谢!
您需要使用 C 运行时库函数。 strcmp
比较 ANSI 字符串,wcscmp
比较 UNICODE 字符串。
你像这样使用它:
bool match = wcscmp(strPermission, L"0") == 0;
您不能像 C 或 C++ 那样比较 C 样式的字符串。看看这个C FAQ问题和答案。
您要查找的函数称为 lstrcmp
。
>LPCTSTR
是指向const wchar_t
数组的指针。 strPermission
指向数组的第一个字符。 L"0"
是一个字符串文字,它是一个const wchar_t
数组,衰减为const wchar_t
指针。 但是指针并不相等,它们指向不同的数组。 这就是我们发明C++的原因。 请使用它。
std::wstring strPermission = Method();
return (strPermission == L"0"); //works like magic!
或者,如果Method
返回您必须保留的内容,请至少执行此操作
std::unique_ptr<wchar_t[]> strPermission = Method();
return (std::wcscmp(strPermission.get(), L"0")==0);
//wcscmp is for comparing strings, but returns 0 if they're equal.
另外,您确定strPemission
指向包含零字符后跟空字符的数组吗? 如果没有,并且您没有使用 wstring
,那么您还必须检查它是否指向数组
if (strPermission)
//do stuff
else
//its a NULL pointer.
克里斯敦促我指出,LPCTSTR
的类型实际上取决于编译器选项。 我可以通过您的代码判断您正在使用_UNICODE
集合进行编码,这使它成为一个const wchar_t*
,但是如果您希望能够使用其他选项进行编译(我想不出这样做的充分理由(,您应该使用_tcscmp
进行比较,将文字作为_T("0")
,它们将是TCAHR
数组。 对于字符串,您必须在某处添加一个 typedef:
#ifdef _UNICODE
typedef std::string std::tstring
//you'll probably have to add more t helper functions here
#else
typedef std::string std::wstring
//you'll probably have to add more t helper functions here
#endif
如果你想确定你的代码总是_UNICODE
的(这就是我所做的(,显式调用MethodW()
而不是Method()
。 (也有相应的MethodA()
,但没有太多理由称呼它(。
还有一个UNICODE
宏,但它应始终与_UNICODE
宏相同。 (切勿自己定义这些,它们属于项目选项(