Как конвертировать std :: string в LPCSTR?

Как я могу преобразовать std::string в LPCSTR

Я полностью запутался с этими LPCSTR LPSTR LPWSTR и LPCWSTR.

LPWSTR и LPCWSTR то же самое?

101 голос | спросил Cute 29 J000000Wednesday09 2009, 17:18:16

8 ответов


0

str.c_str() дает вам const char * , который является LPCSTR (Long Pointer to Constant STRing) - означает, что это указатель на 0 завершенная строка символов. W означает широкую строку (состоящую из wchar_t вместо char).

ответил Lou Franco 29 J000000Wednesday09 2009, 17:21:28
0

Позвоните c_str(), чтобы получить const char * (LPCSTR) из std::string.

Это все во имя:

LPSTR - (длинный) указатель на строку - char *

LPCSTR - (длинный) указатель на постоянную строку - const char *

LPWSTR - (длинный) указатель на строку Unicode (широкая) - wchar_t *

LPCWSTR - (длинный) указатель на постоянную строку в Юникоде (широкая) - const wchar_t *

LPTSTR - (длинный) указатель на строку TCHAR (Unicode, если определен UNICODE, ANSI, если нет) - TCHAR *

LPCTSTR - (длинный) указатель на постоянную строку TCHAR - const TCHAR *

Вы можете игнорировать L (длинную) часть имен - это пережиток 16-битной Windows.

ответил Nick Meyer 29 J000000Wednesday09 2009, 17:22:20
0

Это определенные Microsoft определения типов, которые соответствуют:

LPCSTR: указатель на константную строку с нулевым символом в конце char

LPSTR: указатель на символьную строку с нулевым символом в конце char (часто буфер передается и используется в качестве параметра «output»)

LPCWSTR: указатель на завершенную нулем строку const wchar_t

LPWSTR: указатель на завершающуюся нулем строку wchar_t (часто буфер передается и используется в качестве параметра вывода)

Чтобы «преобразовать» std::string в LPCSTR, зависит от конкретного контекста, но обычно вызывается .c_str() достаточно.

Это работает.

void TakesString(LPCSTR param);

void f(const std::string& param)
{
    TakesString(param.c_str());
}

Обратите внимание, что вы не должны пытаться делать что-то подобное.

LPCSTR GetString()
{
    std::string tmp("temporary");
    return tmp.c_str();
}

Буфер, возвращаемый .c_str(), принадлежит std::string и будет действителен только до следующего изменения или уничтожения строки.

Чтобы преобразовать std::string в LPWSTR сложнее. Желание LPWSTR подразумевает, что вам нужен модифицируемый буфер, и вы также должны быть уверены, что понимаете, что такое кодировка символов std::string используется. Если std::string содержит строку, использующую системную кодировку по умолчанию (здесь предполагается, что окна), тогда вы можете найти длину требуемого широкого символа буферизуйте и выполняйте транскодирование, используя MultiByteToWideChar (функция Win32 API).

например.

void f(const std:string& instr)
{
    // Assumes std::string is encoded in the current Windows ANSI codepage
    int bufferlen = ::MultiByteToWideChar(CP_ACP, 0, instr.c_str(), instr.size(), NULL, 0);

    if (bufferlen == 0)
    {
        // Something went wrong. Perhaps, check GetLastError() and log.
        return;
    }

    // Allocate new LPWSTR - must deallocate it later
    LPWSTR widestr = new WCHAR[bufferlen + 1];

    ::MultiByteToWideChar(CP_ACP, 0, instr.c_str(), instr.size(), widestr, bufferlen);

    // Ensure wide string is null terminated
    widestr[bufferlen] = 0;

    // Do something with widestr

    delete[] widestr;
}
ответил CB Bailey 29 J000000Wednesday09 2009, 17:28:02
0

Используя LPWSTR, вы можете изменить содержимое строки, на которое она указывает. Используя LPCWSTR, вы не можете изменить содержимое строки там, где она указывает.

std::string s = SOME_STRING;
// get temporary LPSTR (not really safe)
LPSTR pst = &s[0];
// get temporary LPCSTR (pretty safe)
LPCSTR pcstr = s.c_str();
// convert to std::wstring
std::wstring ws; 
ws.assign( s.begin(), s.end() );
// get temporary LPWSTR (not really safe)
LPWSTR pwst = &ws[0];
// get temporary LPCWSTR (pretty safe)
LPCWSTR pcwstr = ws.c_str();

LPWSTR - это просто указатель на исходную строку. Вы не должны возвращать его из функции, используя пример выше. Чтобы получить не временный LPWSTR, вы должны сделать копию оригинальной строки в куче. Проверьте образец ниже:

LPWSTR ConvertToLPWSTR( const std::string& s )
{
  LPWSTR ws = new wchar_t[s.size()+1]; // +1 for zero at the end
  copy( s.begin(), s.end(), ws );
  ws[s.size()] = 0; // zero at the end
  return ws;
}

void f()
{
  std::string s = SOME_STRING;
  LPWSTR ws = ConvertToLPWSTR( s );

  // some actions

  delete[] ws; // caller responsible for deletion
}
ответил Kirill V. Lyadvinsky 29 J000000Wednesday09 2009, 20:28:31
0

Ответ MultiByteToWideChar, который дал Чарльз Бейли, является правильным. Потому что LPCWSTR это просто определение типа для const WCHAR* , widestr в примере кода можно использовать везде, где LPWSTR или там, где ожидается LPCWSTR.

Одна небольшая настройка - использовать std::vector<WCHAR> вместо массива, управляемого вручную:

// using vector, buffer is deallocated when function ends
std::vector<WCHAR> widestr(bufferlen + 1);

::MultiByteToWideChar(CP_ACP, 0, instr.c_str(), instr.size(), &widestr[0], bufferlen);

// Ensure wide string is null terminated
widestr[bufferlen] = 0;

// no need to delete; handled by vector

Кроме того, если для начала вам нужно работать с широкими строками, вы можете использовать std::wstring вместо std::string. Если вы хотите работать с типом Windows TCHAR, вы можете использовать std::basic_string<TCHAR>. Преобразование из std::wstring в LPCWSTR или из ---- +: = 14 =: + ---- to std::basic_string<TCHAR> это просто вопрос вызова LPCTSTR. Когда вы переключаетесь между символами ANSI и UTF-16, c_str (и его обратное MultiByteToWideChar) входит в картинку.

ответил Joel 29 J000000Wednesday09 2009, 22:00:56
0

Преобразовать просто:

std::string myString;

LPCSTR lpMyString = myString.c_str();

Здесь следует быть осторожным: c_str не возвращает копию myString, а просто указывает на строку символов, которую переносит std :: string. Если вы хотите /нуждаетесь в копии, вам нужно сделать ее самостоятельно, используя strcpy.

ответил Nick Haddad 29 J000000Wednesday09 2009, 17:29:48
0

Преобразование просто:

std :: string str; LPCSTR lpcstr = str.c_str ();

ответил Timbo 29 J000000Wednesday09 2009, 17:21:45
0

Самый простой способ преобразовать std::string в LPWSTR по моему мнению:

  1. Преобразуйте std::string в std::vector<wchar_t>
  2. Возьмите адрес первого wchar_t в векторе.

std::vector<wchar_t> имеет шаблонный ctor, который будет принимать два итератора, например std::string.begin() и .end() итераторы. Это преобразует каждый символ в wchar_t. Это допустимо только в том случае, если std::string содержит ASCII или Latin-1, из-за того, что значения Unicode напоминают значения Latin-1. Если он содержит CP1252 или символы из любой другой кодировки, это более сложно. Затем вам нужно будет преобразовать символы.

ответил MSalters 29 J000000Wednesday09 2009, 18:03:09

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132