C++ MFC, как сравнить LPCTSTR в операторе if?
У меня есть следующий код:
LPCTSTR strPermission = Method();
if (strPermission == L"0")
{
return true;
}
else
{
return false;
}
Во время отладки я вижу, что strPermission равен "0", но когда я сравниваю его, как в операторе if, он всегда возвращает false.
Единственное, о чем я могу думать, - это сравнение адреса памяти переменной, а не ее значения.
Как сравнить strPermission с L "0", чтобы он возвращал значение true, если strPermission равно "0".
Спасибо!
3 ответа
Вам нужно будет использовать функцию библиотеки времени выполнения C. strcmp
сравнивает строки ANSI, wcscmp
сравнивает строки UNICODE.
Вы используете это так:
bool match = wcscmp(strPermission, L"0") == 0;
Вы не можете сравнивать строки в стиле C, как в C или C++. Проверьте этот вопрос часто задаваемых вопросов C & ответ.
Функция, которую вы ищете, называется 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
макро. (Никогда не определяйте их сами, они относятся к параметрам проекта)