как я могу сделать состояние с сопзЬ wchar_t *? Я пробовал const wchar_t* password if (L"xyz" == password) {...}
, но это не работаетсделать условие на сопзЬ wchar_t *
спасибо
как я могу сделать состояние с сопзЬ wchar_t *? Я пробовал const wchar_t* password if (L"xyz" == password) {...}
, но это не работаетсделать условие на сопзЬ wchar_t *
спасибо
Вы должны взглянуть на wcscmp
const wchar_t* password = L"xyz";
if (wcscmp(password, L"xyz") == 0) {
// Strings are identical
}
Когда вы делаете L"xyz" == whatever
(или даже неширокая версия, "xyz" == whatever
), вы сравниваете указатели, а не строковое содержимое.
E.g. скажем, ваша переменная password
хранится в памяти 0x00100000
, а постоянная L"xyz"
хранится в месте 0x00200000
. Когда вы выполняете тест равенства с линией L"xyz" == password
, то, что он фактически сравнивает, это 0x00100000 == 0x00200000
, что, очевидно, никогда не будет правдой.
Что вам нужно сделать, так это использовать библиотечную функцию wcscmp
для сравнения строк с широким символом. Однако, поскольку это помечено как C++, вы должны использовать std::wstring
и перегруженный operator ==
, если у вас нет причин использовать строки C. Это может быть там, где вы запутались: при использовании std::string
или std::wstring
вы можете использовать==
для сравнения строк, потому что эти классы перегрузить оператор ==
так что этот код работает отлично:
#include <iostream>
#include <string>
int main(int argc, char *argv[])
{
std::wstring wstr = L"Hello World";
if(wstr == L"Hello World")
{
std::wcout << wstr << std::endl;
}
return 0;
}
В качестве примечания, вы действительно не следует использовать константы для хранения паролей в вашей программе, если они не зашифрованы каким-то образом.
http://en.cppreference.com/w/cpp/string/wide/wcscmp или использовать 'std :: wstring'. – DeiDei
Сравните содержимое, не содержащее ни одного poniters – doctorlove
Я хочу сравнить содержимое, а не указатели –