Как я могу преобразовать std::string
в LPCSTR
? Кроме того, как я могу преобразовать std::string
в LPWSTR
?
Я совершенно запутался в этих LPCSTR
LPSTR
LPWSTR
и LPCWSTR
.
Есть LPWSTR
и LPCWSTR
то же?
str.c_str()
дает вам const char *
, что является LPCSTR
(Длинный указатель на постоянную строку) - означает, что это указатель на 0
завершенную строку символов. W
означает широкую строку (составленную из wchar_t
вместо char
).
Позвоните,
c_str()
чтобы получитьconst char *
(LPCSTR
) от astd::string
.Все дело в названии:
LPSTR
- (длинный) указатель на строку -char *
LPCSTR
- (длинный) указатель на постоянную строку -const char *
LPWSTR
- (длинный) указатель на строку Unicode (широкую) -wchar_t *
LPCWSTR
- (длинный) указатель на постоянную строку Unicode (широкую) -const wchar_t *
LPTSTR
- (длинный) указатель на TCHAR (Unicode, если UNICODE определен, ANSI, если нет) строка -TCHAR *
LPCTSTR
- (длинный) указатель на постоянную строку TCHAR -const TCHAR *
Вы можете игнорировать L (длинную) часть имен - это пережиток 16-битной Windows.
источник
Это определенные Microsoft typedef, которые соответствуют:
LPCSTR: указатель на константную строку с завершающим нулем
char
LPSTR: указатель на строку символов с завершающим нулем
char
(часто передается буфер и используется как параметр вывода)LPCWSTR: указатель на строку константы с завершающим нулем
wchar_t
LPWSTR: указатель на строку с завершающим нулем
wchar_t
(часто передается буфер и используется как параметр вывода)«Преобразование» a
std::string
в LPCSTR зависит от точного контекста, но обычно.c_str()
достаточно вызова .Это работает.
Учтите, что вам не следует пытаться сделать что-то подобное.
Буфер, возвращаемый объектом
.c_str()
, принадлежитstd::string
экземпляру и будет действителен только до следующего изменения или уничтожения строки.Преобразовать a
std::string
в aLPWSTR
сложнее. ХотетьLPWSTR
означает , что вам нужно изменяемый буфер , и вы также должны быть уверены , что вы понимаете , что кодировка символовstd::string
используется. Еслиstd::string
содержит строку с использованием системной кодировки по умолчанию (здесь предполагается Windows), то вы можете найти длину требуемого буфера широких символов и выполнить перекодирование с помощьюMultiByteToWideChar
(функции Win32 API).например
источник
Используя,
LPWSTR
вы можете изменить содержимое строки, на которую она указывает. Используя,LPCWSTR
вы не могли изменить содержимое строки, на которую она указывает.LPWSTR
это просто указатель на исходную строку. Вы не должны возвращать его из функции, используя пример выше. Чтобы не получить временное,LPWSTR
вы должны сделать копию исходной строки в куче. Проверьте образец ниже:источник
MultiByteToWideChar
Ответ , что Чарльз Бейли дал правильный один. ПосколькуLPCWSTR
это просто typedef дляconst WCHAR*
,widestr
в примере кода его можно использовать везде, гдеLPWSTR
ожидается или гдеLPCWSTR
ожидается.Одна небольшая поправка заключается в использовании
std::vector<WCHAR>
вместо массива, управляемого вручную:Кроме того, если вам нужно для начала работать с широкими строками, вы можете использовать
std::wstring
вместоstd::string
. Если вы хотите работать сTCHAR
типом Windows , вы можете использоватьstd::basic_string<TCHAR>
. Преобразование изstd::wstring
вLPCWSTR
или изstd::basic_string<TCHAR>
вLPCTSTR
- это просто вопрос звонкаc_str
. Когда вы переключаетесь между символами ANSI и UTF-16, этоMultiByteToWideChar
(и его обратноеWideCharToMultiByte
) появляется на картинке.источник
Преобразование простое:
std :: string str; LPCSTR lpcstr = str.c_str ();
источник
Конвертировать просто:
Здесь следует остерегаться того, что c_str возвращает не копию myString, а просто указатель на символьную строку, которую оборачивает std :: string. Если вы хотите / вам нужна копия, вам нужно будет сделать ее самостоятельно, используя strcpy.
источник
На мой взгляд, самый простой способ преобразовать a
std::string
в aLPWSTR
:std::string
в аstd::vector<wchar_t>
wchar_t
в векторе.std::vector<wchar_t>
имеет шаблонный CTOR , который будет принимать два итератора, как, например ,std::string.begin()
и.end()
итераторы.wchar_t
Тем не менее, это преобразует каждый символ в . Это допустимо, только еслиstd::string
содержит ASCII или Latin-1 из-за того, что значения Unicode похожи на значения Latin-1. Если он содержит CP1252 или символы из любой другой кодировки, все сложнее. Затем вам нужно будет преобразовать символы.источник
std::wstring
?myString - это входная строка, а lpSTR - это эквивалент LPSTR .
источник