如何将 std: : string 转换为 LPCSTR?

如何将 std::string转换为 LPCSTR? 还有,如何将 std::string转换为 LPWSTR

我完全搞不懂这些 LPCSTR LPSTR LPWSTRLPCWSTR

LPWSTRLPCWSTR是一样的吗?

234864 次浏览

str.c_str()给出一个 const char *,它是一个 LPCSTR(常量字符串的长指针)——意味着它是一个指向以 0结尾的字符串的指针。W表示宽字符串(由 wchar_t而不是 char组成)。

转变很简单:

字符串 str; LPCSTR LPCSTR = str.c _ str () ;

调用 c_str()std::string获取 const char *(LPCSTR)。

一切都在这个名字里:

指向字符串的(长)指针 -char *

指向常量字符串的(长)指针 -const char *

指向 Unicode (宽)字符串的(长)指针

指向常量 Unicode (宽)字符串的(长)指针 -const wchar_t *

指向 TCHAR (如果定义了 UNICODE,则为 UNICODE,如果没有定义,则为 ANSI)字符串的(长)指针

指向常量 TCHAR 字符串的(长)指针 -const TCHAR *

您可以忽略名称中的 L (长)部分——它是16位 Windows 的遗留。

这些是 Microsoft 定义的 typedef,它们对应于:

指向 char的空终止常量字符串的指针

LPSTR: 指向 char的空终止字符串的指针(通常传递一个缓冲区并将其用作“输出”参数)

指向空终止的常量 wchar_t字符串的指针

LPWSTR: 指向以 null 结尾的 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;
}

转换很简单:

std::string myString;


LPCSTR lpMyString = myString.c_str();

这里需要注意的一点是,c _ str 并不返回 myString 的副本,而只是返回一个指向 std: : string 包装的字符串的指针。如果你想要/需要一份拷贝,你需要自己用 strcpy 做一份。

我认为把 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 或拉丁 -1时才有效,因为 Unicode 值类似于拉丁 -1值。如果它包含 CP1252或其他任何编码的字符,那就更复杂了。然后需要转换字符。

使用 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
}

查尔斯 · 贝利给出的 MultiByteToWideChar答案是正确的。因为 LPCWSTR只是 const WCHAR*的 typedef,所以示例代码中的 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。如果要使用 WindowsTCHAR类型,可以使用 std::basic_string<TCHAR>。从 std::wstring转换到 LPCWSTR或者从 std::basic_string<TCHAR>转换到 LPCTSTR只是一个调用 c_str的问题。当您在 ANSI 和 UTF-16字符之间切换时,就会出现 MultiByteToWideChar(及其反向 std::string0)。

std::string myString("SomeValue");
LPSTR lpSTR = const_cast<char*>(myString.c_str());

MyString 是输入字符串,而 LpSTR是它的 LPSTR等价物。