【问题标题】:C++ MFC how to compare LPCTSTR in a if statement?C ++ MFC如何在if语句中比较LPCTSTR?
【发布时间】:2012-04-05 11:47:46
【问题描述】:

我有以下代码:

LPCTSTR strPermission = Method();

if (strPermission == L"0")
{
    return true;
}
else
{
    return false;
}

在调试时,我可以看到 strPermission 确实等于“0”,但是当我像在 if 语句中那样比较它时,它总是返回 false。

我唯一能想到的是,它是在比较变量的内存地址而不是变量值。

如何将 strPermission 与 L"0" 进行比较,以便在 strPermission 等于 "0" 时返回 true。

谢谢!

【问题讨论】:

  • LPCTSTR 是const char*const wchar_t*,所以请考虑一下。另外,您不应该检查 NULL 或 null 终止符,而不是字符串文字“0”吗?
  • 您可以使用 C 风格的字符串比较函数,但使用 TCHAR 的版本,即tcscmp
  • 糟糕,我的意思是 _tcscmp,如果您尝试第一个时有些失望。
  • 关闭,但这些数据类型更具体一点。这是这里的主要问题。

标签: c++ string mfc compare lpcstr


【解决方案1】:

您无法比较 C 或 C++ 中的 C 样式字符串。看看这个C FAQ question & answer

您要查找的函数名为lstrcmp

【讨论】:

    【解决方案2】:

    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 宏相同。 (永远不要自己定义这些,它们属于项目选项)

    【讨论】:

    • 问题是,虽然你可以假设 LPCTSTR 是一个 LPCWSTR 因为问题中的 L"0",但它在技术上是一个 const TCHAR *
    • @chris:技术上是这样,但我忽略了这一点。我会添加评论。
    【解决方案3】:

    您需要使用 C 运行时库函数。 strcmp 比较 ANSI 字符串,wcscmp 比较 UNICODE 字符串。

    你可以这样使用它:

    bool match = wcscmp(strPermission, L"0") == 0;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 2011-08-04
      • 1970-01-01
      • 2022-11-16
      相关资源
      最近更新 更多