2009-07-29 43 views
93

std::stringLPCSTRに変換するにはどうすればよいですか?また、std::stringLPWSTRに変換するにはどうすればよいですか?std :: stringをLPCSTRに変換するには?

私はこれらと全く混同しています。LPCSTRLPSTRLPWSTRおよびLPCWSTRです。

LPWSTRLPCWSTRは同じですか?

答えて

91

str.c_str()はあなたにLPCSTR(定数文字列へのロングポインタ)であるconst char *を与える - それは文字の0終わる文字列へのポインタだということを意味します。 Wは、ワイド文字列(charの代わりにwchar_tで構成されています)を意味します。

+5

小数点:x64上LPCSTRは、(定数の)NULL終端文字列への64ビットポインタです。 – Joel

2

変換は簡単です。

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

138

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にポインタ

32

これらに対応する型定義を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::stringLPWSTRに変換する方が複雑です。 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; 
} 
3

は簡単です。 。コピーが必要な場合は、strcpyを使って自分で作成する必要があります。

+0

std :: StringをLPWSTRに変換する方法 – Cute

1

LPWSTRstd::stringを変換する最も簡単な方法は、私の意見である:

  1. std::stringstd::vector<wchar_t>
  2. への変換ベクトル内の最初のwchar_tのアドレスを取ります。

std::vector<wchar_t>例えばstd::string.begin().end()イテレータのような2つのイテレータを取るテンプレートCTORを有しています。ただし、各チャートはwchar_tに変換されます。 Unicodeの値がLatin-1の値に似ているために、std::stringにASCIIまたはLatin-1が含まれている場合にのみ有効です。CP1252または他のエンコーディングの文字が含まれている場合は、より複雑です。その後、文字を変換する必要があります。

14

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は、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文字の間で変更するときです。

関連する問題