std::string
をLPCSTR
に変換するにはどうすればよいですか?また、std::string
をLPWSTR
に変換するにはどうすればよいですか?std :: stringをLPCSTRに変換するには?
私はこれらと全く混同しています。LPCSTR
LPSTR
LPWSTR
およびLPCWSTR
です。
LPWSTR
とLPCWSTR
は同じですか?
std::string
をLPCSTR
に変換するにはどうすればよいですか?また、std::string
をLPWSTR
に変換するにはどうすればよいですか?std :: stringをLPCSTRに変換するには?
私はこれらと全く混同しています。LPCSTR
LPSTR
LPWSTR
およびLPCWSTR
です。
LPWSTR
とLPCWSTR
は同じですか?
str.c_str()
はあなたにLPCSTR
(定数文字列へのロングポインタ)であるconst char *
を与える - それは文字の0
終わる文字列へのポインタだということを意味します。 W
は、ワイド文字列(char
の代わりにwchar_t
で構成されています)を意味します。
変換は簡単です。
std :: string str; LPCSTR lpcstr = str.c_str();
std::string
からconst char *
(LPCSTR
)を得るには、c_str()
と呼んでください。
それだ全ての名前で:
LPSTR
- 文字列に(ロング)のポインタ - char *
LPCSTR
からconst char *
LPWSTR
- - (ロング)のポインタへの定数文字列に(ロング)のポインタUnicode(ワイド)文字列 - wchar_t *
LPCWSTR
- (long)定数Unicode(ワイド)文字列 - const wchar_t *
LPTSTR
- TCHARに(ロング)のポインタ(UnicodeのUNICODEが定義されている場合は、ANSIでない場合)、文字列 - TCHAR *
LPCTSTR
- 定数TCHAR文字列に(ロング)のポインタ - const TCHAR *
あなたは名前のL(長い)部分を無視することができます。これは16ビットWindowsからのホールドオーバーです。
LPCSTR:char
の終了文字列をnullにポインタ(多くの場合、バッファは次のように渡され、使用されている:char
LPSTRの終了CONST文字列をnullにポインタ
これらに対応する型定義をMicrosoftに定義されています'出力' のparam)
LPCWSTR:
wchar_t
のconst LPWSTRの終端文字列をnullにポインタ:トンをnullにポインタLPCSTRに
std::string
を「変換」する
wchar_t
のerminated文字列(多くの場合、バッファが「出力」のparamとして渡され、使用されている)
は、正確な状況に依存するが、通常は.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関数)を使用してトランスコードを実行できます。
std::string myString;
LPCSTR lpMyString = myString.c_str();
ことの一つは、ここでの注意するはstd文字列へのmyStringのコピーを返さないことc_strが、ちょうどポインタである::文字列ラップ:変換
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;
}
LPWSTR
にstd::string
を変換する最も簡単な方法は、私の意見である:
std::string
はstd::vector<wchar_t>
wchar_t
のアドレスを取ります。std::vector<wchar_t>
例えばstd::string.begin()
と.end()
イテレータのような2つのイテレータを取るテンプレートCTORを有しています。ただし、各チャートはwchar_t
に変換されます。 Unicodeの値がLatin-1の値に似ているために、std::string
にASCIIまたは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();
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であるため、LPWSTR
が期待される場所、またはLPCWSTR
が期待される場所であれば、サンプルコードではwidestr
を使用できます。
一つのマイナーな微調整ではなく、手動で管理されているアレイの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
またはstd::basic_string<TCHAR>
からLPCTSTR
に変換することは、ちょうどc_str
を呼び出してください。これは、MultiByteToWideChar
(とその逆WideCharToMultiByte
)が画像に入るANSIとUTF-16文字の間で変更するときです。
小数点:x64上LPCSTRは、(定数の)NULL終端文字列への64ビットポインタです。 – Joel