Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将std::string转换为LPCSTR?_C++_Windows_String - Fatal编程技术网

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

C++ 如何将std::string转换为LPCSTR?,c++,windows,string,C++,Windows,String,如何将std::string转换为LPCSTR?另外,如何将std::string转换为LPWSTR 我完全不理解这些LPCSTRLPSTRLPWSTR和LPCWSTR LPWSTR和LPCWSTR是否相同?str.c_str()给您一个const char*,它是一个LPCSTR(指向常量字符串的长指针)——意味着它是指向0终止字符串的指针W表示宽字符串(由wchar\u t组成,而不是char)。转换很简单: std::string myString; LPCSTR lpMyString

如何将
std::string
转换为
LPCSTR
?另外,如何将
std::string
转换为
LPWSTR

我完全不理解这些
LPCSTR
LPSTR
LPWSTR
LPCWSTR


LPWSTR
LPCWSTR
是否相同?

str.c_str()
给您一个
const char*
,它是一个
LPCSTR
(指向常量字符串的长指针)——意味着它是指向
0
终止字符串的指针
W
表示宽字符串(由
wchar\u t
组成,而不是
char
)。

转换很简单:

std::string myString;

LPCSTR lpMyString = myString.c_str();
std::字符串str; LPCSTR LPCSTR=str.c_str()

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

这一切都在名义上:

LPSTR
-(长)字符串指针-
char*

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

LPWSTR
-(长)指针指向Unicode(宽)字符串-
wchar\u t*

LPCWSTR
-(长)指针指向常量Unicode(宽)字符串-
const wchar\u t*

LPTSTR
-(长)指向TCHAR(如果定义了Unicode,则为Unicode,如果未定义,则为ANSI)字符串的指针-
TCHAR*

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


您可以忽略名称的L(长)部分——这是16位Windows的保留。这些是Microsoft定义的TypeDef,对应于:

LPCSTR:指向
char

LPSTR:指向
char
的以null结尾的char字符串的指针(通常传递缓冲区并将其用作“output”参数)

LPCWSTR:指向常量的以null结尾的字符串的指针
wchar\u t

LPWSTR:指向
wchar\u t
的以null结尾的字符串的指针(通常传递缓冲区并将其用作“输出”参数)

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
包含使用系统默认编码的字符串(此处假设为windows),则可以找到所需宽字符缓冲区的长度,并使用
MultiByteToWideChar
(Win32 API函数)执行转码

e、 g

转换很简单:

std::string myString;

LPCSTR lpMyString = myString.c_str();

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

我认为将
std::string
转换为
LPWSTR
最简单的方法是:

  • std::string
    转换为
    std::vector
  • 取向量中第一个
    wchar\u t
    的地址

  • std::vector
    有一个模板化的ctor,它将使用两个迭代器,例如
    std::string.begin()
    .end()
    迭代器。不过,这会将每个字符转换为
    wchar\t
    。这仅在
    std::string
    包含ASCII或Latin-1时有效,因为Unicode值类似于Latin-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();
    

    Charles Bailey给出的
    MultiByteToWideChar
    答案是正确的。由于
    LPCWSTR
    只是
    const WCHAR*
    的一个typedef,因此在示例代码中,
    widestr
    可用于预期出现
    LPWSTR
    的地方或预期出现
    LPCWSTR
    的地方

    一个小的调整是使用
    std::vector
    而不是手动管理的数组:

    // 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::向量宽tr(bufferlen+1);
    ::MultiByteToWideChar(CP_ACP,0,instr.c_str(),instr.size(),&widestr[0],bufferlen);
    //确保宽字符串以null结尾
    宽TR[bufferlen]=0;
    //无需删除;向量处理
    
    此外,如果您需要使用宽字符串,可以使用
    std::wstring
    而不是
    std::string
    。如果要使用Windows
    TCHAR
    类型,可以使用
    std::basic_string
    。从
    std::wstring
    转换为
    LPCWSTR
    或从
    std::basic_string
    转换为
    LPCTSTR
    只需调用
    c_str
    。当您在ANSI和UTF-16字符之间切换时,
    MultiByteToWideChar
    (及其逆
    WideCharToMultiByte
    )出现在图片中;
    std::string myString("SomeValue");
    LPSTR lpSTR = const_cast<char*>(myString.c_str());
    
    LPSTR LPSTR=const_cast(myString.c_str());
    myString是输入字符串,lpSTR是它的lpSTR等价项

    小问题:在x64上,LPCSTR将是一个指向(常量)以null结尾的字符串的64位指针。为什么不使用
    std::wstring
    ?@timmm:C++11收紧了规范,因为实现没有利用旧规则,今天这样就可以了。
    std::string myString("SomeValue");
    LPSTR lpSTR = const_cast<char*>(myString.c_str());