C++:преобразовать LPTSTR в массив символов [дубликат]
-
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 - это a (un-const) tchar string.Зависит ли это Unicode или не оказывается.LPTSTR является CHAR *, если не Unicode, или W_CHAR *, если так.
Если вы используете строки без Юникода LPTSTR, это просто символ *, в противном случае делают:
size_t size = wcstombs(NULL, p, 0);
char* CharStr = new char[size + 1];
wcstombs( CharStr, p, size + 1 );
.
Также эта ссылка может помочь:
Другие советы
LPTSTR
означает TCHAR*
(расширение этих сокращений Win32 typedefs может облегчить их понимание). TCHAR
расширяется до char
в сборках ANSI/MBCS, а также для wchar_t
в сборках Unicode (которые в наши дни должны использоваться по умолчанию для лучшей поддержки интернационализации).
В этой таблице кратко представлены TCHAR
расширения в сборках ANSI/MBC и 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]
.
Что касается вашего вопроса, ЛПЦТР (Длинный указатель на строку TCHAR) эквивалентно LPWSTR
(который w_char*
), если это Юникод, или просто 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