VS2005 VC WIN32でプログラミングしています。文字列をコピーしたいと思います。ポインタのコピーではなく、実態の文字列のコピーです。


LPCTSTR lpStringの文字列をWIDE CHARの文字列にコピーしたいときどのように宣言、コピー関数を作ればいいのでしょうか? lpStringはコピー後、消えます。また、消えた後にコピーの文字列を利用したいので実態のコピーが必要になります。

宜しくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2009/10/13 16:12:58
  • 終了:2009/10/20 16:15:02

回答(2件)

id:makeworld No.1

makeworld回答回数75ベストアンサー獲得回数232009/10/13 21:03:01

ポイント35pt

TCHAR又はWCHARの配列を宣言して、コピーすれば良いと思います。

int _tmain(int argc, _TCHAR* argv[])
{
	LPCTSTR lpString = L"something";

	TCHAR tbuff[512];
	_tcscpy_s(tbuff, _countof(tbuff), lpString);
	MessageBox(NULL, tbuff, L"tbuff", MB_OK);

	WCHAR wbuff[512];
	wcscpy_s(wbuff, _countof(wbuff), lpString);
	MessageBox(NULL, wbuff, L"wbuff", MB_OK);

	return 0;
}
id:espresso3389 No.2

espresso3389回答回数35ベストアンサー獲得回数62009/10/15 10:29:40

ポイント35pt

まず、LPTSTR/LPCTSTRは、UNICODEマクロによって、ANSI(いわゆるShift_JIS)/UNICODEが変わることに注意すべきです。

確実にANSIである場合には、LPSTR/LPCSTRを利用します。逆に確実にUNICODEである場合には、LPWSTR/LPCWSTRを使います。

従って、全体的には次のようになるかと(エラー処理等、省略しています)。

LPWSTR copyToWString(LPCTSTR input)
#ifdef UNICODE
	return _wcsdup(input);
#else
	int size = MultiByteToWideChar(CP_ACP, 0, input, -1, NULL, 0);
	LPWSTR p = malloc(size * sizeof(WCHAR));
	MultiByteToWideChar(CP_ACP, 0, input, -1, p, size);
	return p;
#endif
}

また、この例では、内部で、メモリ確保のためにmalloc/_wcsdupを使っているので、返された文字列が必要なくなったら、freeで解放する必要があります。

  • id:mai_mai_mail
    追記です。unicode環境です。
  • id:tdoi
    _tcscpy_sを使えばよいのでは?
    http://www.usefullcode.net/2006/12/windowstchar.html

    あるいは、MFCが利用できるならば、CStringで管理してしまうとか。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません