C ++, WCHAR [] в std :: cout и сравнение - PullRequest
1 голос
/ 26 октября 2009

Мне нужно поместить WCHAR [] в std :: cout ... Это часть PWLAN_CONNECTION_NOTIFICATION_DATA, переданная из обратного вызова Native Wifi API.

Я попробовал просто std :: cout << var; но он печатает числовой адрес первого символа. сравнение (<code>var == L"some text") тоже не работает. Отладчик возвращает ожидаемое значение, однако сравнение возвращает 0. Как я могу преобразовать этот массив в стандартную строку (std :: string)?

Заранее спасибо

Ответы [ 4 ]

12 голосов
/ 26 октября 2009

Некоторые решения:

  • Вместо этого пишите в std :: wcout
  • Convert:
    • Стандартный способ, используя std :: codecvt
    • Путь Win32, использующий WideCharToMultibyte
8 голосов
/ 26 октября 2009

Для печати на cout вместо нее следует использовать std::wcout.

Что касается сравнения, я не совсем уверен, что вы имеете в виду.

  • если var является wchar_t[], то вы сравниваете два указателя. И результат, скорее всего, будет ложным, потому что, хотя содержимое строки может быть одинаковым, они физически размещаются в разных местах памяти. Ответ заключается в том, чтобы либо использовать функцию, подобную strcmp, которая сравнивает строки в стиле C (указатели на символы), либо использовать класс строки C ++.
  • и operator== обычно возвращает bool, а не целое число. Таким образом, он может вернуть false, но не может вернуть 0 ... Если только вы сами не создали какую-то странную перегрузку. (и это возможно только в том случае, если var является пользовательским типом.
3 голосов
/ 01 июня 2010

используйте следующее

#ifdef UNICODE
#define tcout wcout
#else
#define tcout cout
#endif
3 голосов
/ 26 октября 2009

Предполагая, что var равен wchar_t *, var == L"some text" выполняет сравнение указателей. Чтобы сравнить строку, указанную в var, используйте функцию, такую ​​как wcscmp.

...