C++ MFC 如何在 if 语句中比较 LPCTSTR



我有以下代码:

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宏相同。 (切勿自己定义这些,它们属于项目选项(

最新更新