سؤال

تكرار ممكن:
تحويل لبتستر إلى شار*

أحتاج إلى تحويل 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top