C++:converter LPTSTR para char matriz [duplicado]
-
12-12-2019 - |
Pergunta
Possíveis Duplicados:
Converter lptstr char*
Eu preciso converter um LPTSTR p
para CHAR ch[]
.Eu sou novo para 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;
}
Obrigado antecipadamente.
Solução
LPTSTR é um (não constante) TCHAR de seqüência de caracteres.Depende se for Unicode ou não aparece.LPTSTR é char* se não Unicode, ou w_char* em caso afirmativo.
Se você estiver usando cadeias Unicode LPTSTR é apenas um char*, caso contrário, fazer:
size_t size = wcstombs(NULL, p, 0);
char* CharStr = new char[size + 1];
wcstombs( CharStr, p, size + 1 );
Além disso, este link pode ajudar:
Outras dicas
LPTSTR
significa TCHAR*
(ampliando os Win32 siglas typedefs pode torná-lo mais fácil de entender). TCHAR
expande-se para char
no ANSI/MBCS constrói, e para wchar_t
em Unicode compilações (que deve ser o padrão nestes dias para um melhor apoio à internacionalização).
Esta tabela resume as TCHAR
expansões em ANSI/MBCS e Unicode cria:
| ANSI/MBCS | Unicode
--------+----------------+-----------------
TCHAR | char | wchar_t
LPTSTR | char* | wchar_t*
LPCTSTR | const char* | const wchar_t*
Assim, na ANSI/MBCS constrói, LPTSTR
expande-se para char*
;em compilações do Unicode, expande-se para wchar_t*
.
char ch[MAX_PATH]
é uma matriz de char
's em ANSI e Unicode cria.
Se você deseja converter de um TCHAR
string (LPTSTR
) para um ANSI/cadeia de caracteres MBCS (char
-com), você pode usar ATL de seqüência de caracteres de conversão de ajudantes, por exemplo:
LPTSTR psz; // TCHAR* pointing to something valid
CT2A ch(psz); // convert from TCHAR string to char string
(Observe também que, no seu código original, você deve chamar CString::ReleaseBuffer()
qual é o simétrico de CString::GetBuffer()
.)
Código de exemplo segue:
// 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;
Note-se também que a conversão de Unicode para ANSI pode ser com.
Primeiro, você definidos char* ch[MAX_PATH]
em vez de char ch[MAX_PATH]
.
Em relação à sua questão, LPTSTR (Ponteiro longo para TCHAR Cadeia) é equivalente a LPWSTR
(o que é w_char*
) se é unicode, ou apenas LPSTR (char*
) se não for.Você pode usar este link para referência sobre conversão em cada caso.
EDITAR:Para ir direto ao assunto, aqui está o código:
if (sizeof(TCHAR) == sizeof(char)) // String is non-unicode
strcpy(ch, (char*)(p));
else // String is unicode
wcstombs(ch, p, MAX_PATH);
EDIT 2:No windows eu recomendo usar TCHAR
em vez de char
.Ela vai lhe poupar algumas dores de cabeça.
EDIÇÃO 3:Como uma nota de lado, se você quiser impedir que o Visual Studio a partir de inundações você com avisos sobre funções não seguras, você pode adicionar algo como o seguinte para o início do código:
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif