C++: конвертировать LPTSTR в массив символов
Возможный дубликат:
Конвертировать 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;
}
Заранее спасибо.
3 ответа
LPTSTR является (неконстантной) строкой TCHAR. Зависит, если это Unicode или нет, он появляется. LPTSTR - это char *, если не Unicode, или w_char*, если это так.
Если вы используете не-Unicode строки, LPTSTR это просто символ *, в противном случае выполните:
size_t size = wcstombs(NULL, p, 0);
char* CharStr = new char[size + 1];
wcstombs( CharStr, p, size + 1 );
Также эта ссылка может помочь:
Во-первых, вы определили char* ch[MAX_PATH]
вместо char ch[MAX_PATH]
,
Что касается вашего вопроса, LPTSTR (Long Pointer to TCHAR String) эквивалентен 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
LPTSTR
средства TCHAR*
(Расширение этих аббревиатур Win32 typedefs может облегчить их понимание). 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 может привести к потерям.