C++:converti LPTSTR in array di caratteri [duplicato]
-
12-12-2019 - |
Domanda
Possibile duplicato:
Converti lptstr in carattere*
Ho bisogno di convertire un file LPTSTR p
A CHAR ch[]
.Sono nuovo in 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;
}
Grazie in anticipo.
Soluzione
LPTSTR è una stringa TCHAR (non const).Dipende se è Unicode o meno, appare.LPTSTR è char* se non è Unicode o w_char* in caso affermativo.
Se stai utilizzando stringhe non Unicode LPTSTR è solo un carattere*, altrimenti esegui:
size_t size = wcstombs(NULL, p, 0);
char* CharStr = new char[size + 1];
wcstombs( CharStr, p, size + 1 );
Inoltre, questo collegamento può aiutare:
Altri suggerimenti
LPTSTR
significa TCHAR*
(l'espansione dei typedef degli acronimi Win32 può renderne più semplice la comprensione). TCHAR
si espande a char
nelle build ANSI/MBCS e a wchar_t
nelle build Unicode (che dovrebbe essere l'impostazione predefinita in questi giorni per un migliore supporto all'internazionalizzazione).
Questa tabella riassume il TCHAR
espansioni nelle build ANSI/MBCS e Unicode:
| ANSI/MBCS | Unicode
--------+----------------+-----------------
TCHAR | char | wchar_t
LPTSTR | char* | wchar_t*
LPCTSTR | const char* | const wchar_t*
Quindi, nelle build ANSI/MBCS, LPTSTR
si espande a char*
;nelle build Unicode si espande in wchar_t*
.
char ch[MAX_PATH]
è un array di char
è presente sia nelle build ANSI che Unicode.
Se vuoi convertire da a TCHAR
corda (LPTSTR
) in una stringa ANSI/MBCS (char
-based), è possibile utilizzare Aiutanti per la conversione di stringhe ATL, per esempio.:
LPTSTR psz; // TCHAR* pointing to something valid
CT2A ch(psz); // convert from TCHAR string to char string
(Nota anche che nel tuo codice originale dovresti chiamare CString::ReleaseBuffer()
che è il simmetrico di CString::GetBuffer()
.)
Codice d'esempio 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;
Nota anche questo la conversione da Unicode ad ANSI può comportare perdite.
Innanzitutto, hai definito char* ch[MAX_PATH]
invece di char ch[MAX_PATH]
.
Per quanto riguarda la tua domanda, LPTSTR (Puntatore lungo alla stringa TCHAR) è equivalente a LPWSTR
(che è w_char*
) se è unicode o solo LPSTR (char*
) se non è.Puoi usare questo link per riferimento sulla conversione in ciascun caso.
MODIFICARE:Per andare al sodo, ecco del codice:
if (sizeof(TCHAR) == sizeof(char)) // String is non-unicode
strcpy(ch, (char*)(p));
else // String is unicode
wcstombs(ch, p, MAX_PATH);
MODIFICA 2:In Windows consiglierei di utilizzare TCHAR
invece di char
.Ti farà risparmiare qualche mal di testa.
MODIFICA 3:Come nota a margine, se vuoi evitare che Visual Studio ti inonda di avvisi su funzioni non sicure, puoi aggiungere qualcosa di simile al seguente all'inizio del tuo codice:
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif