C++:LPTSTRをchar配列に変換する[複製]
-
12-12-2019 - |
質問
可能な重複:
Lptstrをcharに変換する*
私は変換する必要があります LPTSTR p
に CHAR ch[]
.私はC++が初めてです。
#include "stdafx.h"
#define _WIN32_IE 0x500
#include <shlobj.h>
#include <atlstr.h>
#include <iostream>
#include <Strsafe.h>
using namespace std;
int main(){
int a;
string res;
CString path;
char ch[MAX_PATH];
LPTSTR p = path.GetBuffer(MAX_PATH);
HRESULT hr = SHGetFolderPath(NULL,CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, p);
/* some operation with P and CH */
if(SUCCEEDED(hr))
{ /* succeeded */
cout << ch;
} /* succeeded */
else
{ /* failed */
cout << "error";
} /* failed */
cin >> a;
return 0;
}
事前に感謝します。
解決
LPTSTRは(非const)TCHAR文字列です。それがUnicodeであるかどうかによって異なります。Lptstrは、Unicodeでない場合はchar*、そうである場合はw_char*です。
非Unicode文字列を使用している場合、LPTSTRは単なるchar*です。:
size_t size = wcstombs(NULL, p, 0);
char* CharStr = new char[size + 1];
wcstombs( CharStr, p, size + 1 );
また、このリンクは助けることができます:
他のヒント
LPTSTR
を意味します。 TCHAR*
(これらのWin32頭字語のtypedefを拡張すると、それらを理解しやすくなります)。 TCHAR
に展開されます char
ANSI/MBCSビルドでは、次のようになります wchar_t
Unicodeビルド(より良い国際化サポートのためにこれらの日のデフォルトであるべきです)。
次の表は、次の表の概要です TCHAR
ANSI/MBCSおよびUnicodeビルドの拡張:
| ANSI/MBCS | Unicode
--------+----------------+-----------------
TCHAR | char | wchar_t
LPTSTR | char* | wchar_t*
LPCTSTR | const char* | const wchar_t*
したがって、ANSI/MBCSビルドでは, LPTSTR
に展開されます char*
;Unicodeビルドでは、次のように展開されます wchar_t*
.
char ch[MAX_PATH]
の配列です char
ANSIとUnicodeの両方でビルドされています。
から変換したい場合は、 TCHAR
文字列(LPTSTR
)ANSI/MBCS文字列(char
-ベース)、使用できます ATL文字列変換ヘルパー, 、例えば、:
LPTSTR psz; // TCHAR* pointing to something valid
CT2A ch(psz); // convert from TCHAR string to char string
(元のコードでは、次のように呼び出す必要があることにも注意してください CString::ReleaseBuffer()
これはの対称です CString::GetBuffer()
.)
サンプルコード 次のとおりです。:
// Include ATL headers to use string conversion helpers
#include <atlbase.h>
#include <atlconv.h>
...
LPTSTR psz = path.GetBuffer(MAX_PATH);
HRESULT hr = SHGetFolderPath(NULL,CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, psz);
path.ReleaseBuffer();
if (FAILED(hr))
{
// handle error
...
}
// Convert from TCHAR string (CString path) to char string.
CT2A ch(path);
// Use ch...
cout << static_cast<const char*>(ch) << endl;
また、注意してください UnicodeからANSIへの変換は非可逆である可能性があります.
まず、定義しました char* ch[MAX_PATH]
の代わりに char ch[MAX_PATH]
.
あなたの質問に関しては、LPTSTR(TCHAR文字列への長いポインタ)は以下と等価である。 LPWSTR
(これは w_char*
)それがunicodeの場合、または単にLPSTR(char*
)そうでない場合。あなたが使用することができます このリンク それぞれの場合の変換についての参考のために。
編集:追跡にカットするには、ここにいくつかのコードがあります:
if (sizeof(TCHAR) == sizeof(char)) // String is non-unicode
strcpy(ch, (char*)(p));
else // String is unicode
wcstombs(ch, p, MAX_PATH);
編集2:Windowsでは、次を使用することをお勧めします TCHAR
の代わりに char
.それはあなたにいくつかの頭痛を保存します。
編集3:補足として、Visual Studioが安全でない関数に関する警告であなたをあふれさせないようにしたい場合は、コードの最初に次のようなものを追加することがで:
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif