C++:تحويل لبستر إلى مجموعة شار [مكررة]
-
12-12-2019 - |
سؤال
تكرار ممكن:
تحويل لبتستر إلى شار*
أحتاج إلى تحويل LPTSTR p
إلى CHAR ch[]
.أنا جديد على سي++.
#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;
}
شكرا مقدما.
المحلول
لتستر هو (غير كونست) سلسلة تشار.يعتمد إذا كان يونيكود أم لا يبدو.لبتستر هو شار * إن لم يكن يونيكود ، أو و_شار* إذا كان الأمر كذلك.
إذا كنت تستخدم سلاسل غير يونيكود لبستر هو مجرد شار* ، وإلا تفعل:
size_t size = wcstombs(NULL, p, 0);
char* CharStr = new char[size + 1];
wcstombs( CharStr, p, size + 1 );
أيضا ، يمكن أن يساعد هذا الرابط:
نصائح أخرى
LPTSTR
يعني TCHAR*
(توسيع تلك وين 32 الاختصارات تيبيديفس يمكن أن تجعل من السهل فهمها). TCHAR
يتوسع إلى char
في أنسي / مبكس يبني ، وإلى wchar_t
في يونيكود يبني (الذي ينبغي أن يكون الافتراضي في هذه الأيام لتحسين دعم التدويل).
يلخص هذا الجدول TCHAR
التوسعات في أنسي/مبكس و ونيكود يبني:
| ANSI/MBCS | Unicode
--------+----------------+-----------------
TCHAR | char | wchar_t
LPTSTR | char* | wchar_t*
LPCTSTR | const char* | const wchar_t*
لذلك ، في أنسي / مبكس يبني, LPTSTR
يتوسع إلى char*
;في يونيكود يبني أنه يوسع إلى wchar_t*
.
char ch[MAX_PATH]
هي مجموعة من char
الصورة في كل من أنسي ويونيكود يبني.
إذا كنت ترغب في تحويل من TCHAR
سلسلة (LPTSTR
) إلى سلسلة أنسي / مبكس (char
- على أساس) ، يمكنك استخدام المساعدين تحويل سلسلة أتل, ، على سبيل المثال.:
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;
لاحظ أيضا أن التحويل من يونيكود إلى أنسي يمكن أن يكون ضياع.
أولا ، لقد حددت char* ch[MAX_PATH]
بدلا من char ch[MAX_PATH]
.
فيما يتعلق بسؤالك ، لبتستر (مؤشر طويل لسلسلة تشار) ما يعادل LPWSTR
(وهو w_char*
) إذا كان يونيكود ، أو فقط لبستر (char*
) إذا لم يكن كذلك.يمكنك استخدام هذا الرابط كمرجع حول التحويل في كل حالة.
تحرير:لقطع لمطاردة ، وهنا بعض التعليمات البرمجية:
if (sizeof(TCHAR) == sizeof(char)) // String is non-unicode
strcpy(ch, (char*)(p));
else // String is unicode
wcstombs(ch, p, MAX_PATH);
تحرير 2:في ويندوز أوصي باستخدام TCHAR
بدلا من char
.سيوفر لك بعض الصداع.
تحرير 3:كملاحظة جانبية ، إذا كنت ترغب في منع فيسوال ستوديو من الفيضانات لكم مع تحذيرات حول وظائف غير آمنة ، يمكنك إضافة شيء مثل ما يلي إلى بداية التعليمات البرمجية الخاصة بك:
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif