C++:Konvertieren Sie LPTSTR in ein Char-Array [Duplikat]
-
12-12-2019 - |
Frage
Mögliches Duplikat:
Konvertieren Sie lptstr in char*
Ich muss eine konvertieren LPTSTR p
Zu CHAR ch[]
.Ich bin neu 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;
}
Dank im Voraus.
Lösung
LPTSTR ist eine (nicht konstante) TCHAR-Zeichenfolge.Hängt davon ab, ob es Unicode ist oder nicht.LPTSTR ist char*, wenn nicht Unicode, oder w_char*, wenn ja.
Wenn Sie Nicht-Unicode-Zeichenfolgen verwenden, ist LPTSTR nur ein Zeichen*, andernfalls gehen Sie wie folgt vor:
size_t size = wcstombs(NULL, p, 0);
char* CharStr = new char[size + 1];
wcstombs( CharStr, p, size + 1 );
Außerdem kann dieser Link helfen:
Andere Tipps
LPTSTR
bedeutet TCHAR*
(Das Erweitern dieser Win32-Akronym-Typedefs kann das Verständnis erleichtern.) TCHAR
erweitert sich auf char
in ANSI/MBCS-Builds und zu wchar_t
in Unicode-Builds (was heutzutage zur besseren Internationalisierungsunterstützung die Standardeinstellung sein sollte).
Diese Tabelle fasst die zusammen TCHAR
Erweiterungen in ANSI/MBCS- und Unicode-Builds:
| ANSI/MBCS | Unicode
--------+----------------+-----------------
TCHAR | char | wchar_t
LPTSTR | char* | wchar_t*
LPCTSTR | const char* | const wchar_t*
In ANSI/MBCS-Builds gilt also: LPTSTR
erweitert sich auf char*
;in Unicode-Builds wird es erweitert auf wchar_t*
.
char ch[MAX_PATH]
ist ein Array von char
ist sowohl in ANSI- als auch in Unicode-Builds enthalten.
Wenn Sie von a konvertieren möchten TCHAR
Zeichenfolge (LPTSTR
) in eine ANSI/MBCS-Zeichenfolge (char
-basiert), können Sie verwenden Hilfsprogramme zur ATL-Stringkonvertierung, z.B.:
LPTSTR psz; // TCHAR* pointing to something valid
CT2A ch(psz); // convert from TCHAR string to char string
(Beachten Sie auch, dass Sie in Ihrem ursprünglichen Code anrufen sollten CString::ReleaseBuffer()
welches die Symmetrie von ist CString::GetBuffer()
.)
Beispielcode folgt:
// 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;
Beachten Sie auch das Die Konvertierung von Unicode nach ANSI kann verlustbehaftet sein.
Zuerst haben Sie definiert char* ch[MAX_PATH]
anstatt char ch[MAX_PATH]
.
Zu Ihrer Frage: LPTSTR (Langer Zeiger auf den TCHAR-String) ist äquivalent zu LPWSTR
(welches ist w_char*
), wenn es Unicode ist, oder nur LPSTR (char*
) wenn es das nicht ist.Sie können verwenden dieser Link als Referenz zur jeweiligen Konvertierung.
BEARBEITEN:Um es auf den Punkt zu bringen, hier ein Code:
if (sizeof(TCHAR) == sizeof(char)) // String is non-unicode
strcpy(ch, (char*)(p));
else // String is unicode
wcstombs(ch, p, MAX_PATH);
BEARBEITEN 2:Unter Windows würde ich die Verwendung empfehlen TCHAR
anstatt char
.Es erspart Ihnen einige Kopfschmerzen.
BEARBEITEN 3:Als Randbemerkung: Wenn Sie verhindern möchten, dass Visual Studio Sie mit Warnungen zu unsicheren Funktionen überschwemmt, können Sie ganz am Anfang Ihres Codes etwas wie das Folgende hinzufügen:
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif