std :: stringをLPCSTRに変換する方法


111

どのようにして変換することができますstd::stringLPCSTR?また、どうすればa std::stringをに変換できLPWSTRますか?

私はこれらLPCSTR LPSTR LPWSTRと完全に混乱していLPCWSTRます。

あるLPWSTRLPCWSTR同じ?

回答:


114

str.c_str()(定数STRingへのロングポインター)const char *であるを提供します。これは、終了した文字列LPCSTRへのポインターであることを意味します0Wワイド文字列を意味します(のwchar_t代わりに構成されるchar)。


5
マイナーピッキーポイント:x64では、LPCSTRは(定数の)nullで終了する文字列への64ビットポインターになります。
ジョエル

154

コールc_str()を取得するためにconst char *LPCSTRから)std::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からの持ち越しです。


32

これらは、以下に対応するMicrosoft定義のtypedefです。

LPCSTR:nullで終了するconst文字列へのポインタ char

LPSTR:nullで終了する文字列へのポインタchar(多くの場合、バッファが渡され、「出力」パラメータとして使用されます)

LPCWSTR:nullで終了するconstの文字列へのポインタ wchar_t

LPWSTR:nullで終了する文字列へのポインターwchar_t(多くの場合、バッファーが渡され、「出力」パラメーターとして使用されます)

std::stringaを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次に文字列が変更または破棄されるまでのみ有効です。

a std::stringをaに変換するの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;
}

18

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

4

MultiByteToWideCharチャールズ・ベイリーが与えた答えが正しいものです。のでLPCWSTRためだけのtypedefでありconst WCHAR*widestrどこのコード例で使用することができるLPWSTRと予想される場合や、LPCWSTR期待されています。

マイナーな調整の1つ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::wstringLPCWSTRまたはからstd::basic_string<TCHAR>にしてLPCTSTR呼び出すだけの問題ですc_str。ANSIとUTF-16文字の間で変更するときMultiByteToWideChar(およびその逆WideCharToMultiByte)が問題になります。


3

変換は簡単です:

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


3

変換は簡単です:

std::string myString;

LPCSTR lpMyString = myString.c_str();

ここで注意すべき点の1つは、c_strはmyStringのコピーを返さず、std :: stringがラップする文字列へのポインタを返すことです。コピーが必要/必要な場合は、strcpyを使用して自分でコピーを作成する必要があります。


1

a std::stringをa に変換する最も簡単な方法LPWSTRは私の意見です:

  1. std::stringをaに変換しますstd::vector<wchar_t>
  2. wchar_tベクトルの最初のアドレスを取得します。

std::vector<wchar_t>には、とのような2つの反復子を使用するテンプレート化されたctorがstd::string.begin()あり.end()ます。wchar_tただし、これは各文字をに変換します。std::stringUnicode値がLatin-1値に似ているため、これがASCIIまたはLatin-1を含む場合にのみ有効です。CP1252または他のエンコーディングの文字が含まれている場合は、さらに複雑になります。次に、文字を変換する必要があります。


なぜ使用しないのstd::wstringですか?
Timmmm 2018年

@Timmmm:実装が古いルールを利用しなかったため、C ++ 11は仕様を厳しくしましたが、今日はそれで問題ありません。
MSalters 2018年

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

myStringは入力文字列で、lpSTRは同等のLPSTRです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.