Я хочу преобразовать станд.:: строка в константу wchar_t *

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

53
задан Jonathan Leffler 4 May 2017 в 14:28
поделиться

4 ответа

Если у Вас есть станд.:: объект wstring, можно звонить c_str() на нем для получения wchar_t*:

std::wstring name( L"Steve Nash" );
const wchar_t* szName = name.c_str();

, Так как Вы воздействуете на узкую строку, однако, необходимо было бы сначала расширить ее. Здесь существуют различные варианты; нужно использовать Windows, встроенный MultiByteToWideChar стандартная программа. Это даст Вам LPWSTR, который эквивалентен wchar_t*.

41
ответ дан b1nary.atr0phy 7 November 2019 в 08:23
поделиться

Сначала преобразуйте его в станд.:: wstring:

std::wstring widestr = std::wstring(str.begin(), str.end());

Тогда получают струну до:

const wchar_t* widecstr = widestr.c_str();

Это только работает на строки ASCII, но это не будет работать, если базовая строка будет закодированным UTF-8. Используя подпрограмму преобразования как MultiByteToWideChar () гарантирует, что этот сценарий обрабатывается правильно.

91
ответ дан Yoav Feuerstein 7 November 2019 в 08:23
поделиться

Можно использовать текстовые макросы преобразования ATL для преобразования узкой (символьной) строки в широкое (wchar_t) один. Например, для преобразования станд.:: строка:

#include <atlconv.h>
...
std::string str = "Hello, world!";
CA2W pszWide(str.c_str());
loadU(pszWide);

можно также определить кодовую страницу, поэтому если станд.:: строка содержит символы UTF-8, которые можно использовать:

CA2W pszWide(str.c_str(), CP_UTF8);

Очень полезный но Windows только.

9
ответ дан Rob 7 November 2019 в 08:23
поделиться

Если вы используете Linux/Unix, посмотрите на mbstowcs () и wcstombs (), определенные в GNU C (из ISO C 90).

  • Мбайт соответствует «Multi Bytes Последовательности» и в основном является обычным нулевым окончанием C последовательности.

  • wcs - это последовательность Wide Char и представляет собой массив wchar_t.

Для получения более подробной информации о широких знаках см. документацию по glibc здесь .

4
ответ дан 7 November 2019 в 08:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: