2012-05-21 2 views
2

Можно создать дубликат:
Convert lptstr to char*C++: преобразование LPTSTR в массив символов

Мне нужно преобразовать LPTSTR p в CHAR ch[]. Я новичок в 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; 
} 

Заранее спасибо.

+2

http://stackoverflow.com/questions/342772/convert-lptstr-to-char – triclosan

ответ

5

LPTSTR является (не const const) строкой TCHAR. Зависит от Unicode или нет. LPTSTR - char *, если не Unicode, или w_char * если это так.

Если вы используете не-Unicode строк LPTSTR это просто символ *, в противном случае сделать:

size_t size = wcstombs(NULL, p, 0); 
char* CharStr = new char[size + 1]; 
wcstombs(CharStr, p, size + 1); 

Кроме того, эта ссылка может помочь:

Convert lptstr to char*

+0

У меня ошибка ошибка C2664: 'wcstombs': невозможно преобразовать параметр 2 из 'LPTSTR' в 'const wchar_t *' –

+0

У вас есть строки, отличные от Unicode, в этом случае вам не нужно использовать wcstombs(). Просто используйте простой листинг для char *. –

+0

+1 'LPTSTR - char *, если не Unicode, или w_char * если это так.« Это было удивительно долгое время, пока я не преодолел эту небольшую ясность. Краткое, полезное резюме того же на http://www.kerwal.com/home/charwchartwchartcharomgwtftmi. – Ben

2

Сначала вы определили char* ch[MAX_PATH] вместо char ch[MAX_PATH].

Что касается вашего вопроса, LPTSTR (Long Pointer в TCHAR Строка) эквивалентно LPWSTR (что w_char*), если это юникод, или просто LPSTR (char*), если это не так. Вы можете использовать this link для справки об конверсии в каждом случае.

EDIT: Для того, чтобы вырезать в погоню, вот некоторый код:

if (sizeof(TCHAR) == sizeof(char)) // String is non-unicode 
    strcpy(ch, (char*)(p));  
else        // String is unicode 
    wcstombs(ch, p, MAX_PATH); 

EDIT 2: В окнах я бы рекомендовал использовать TCHAR вместо char. Это избавит вас от головной боли.

EDIT 3: В качестве примечания, если вы хотите, чтобы предотвратить Visual Studio от наводнения вам предупреждения о небезопасных функций, вы можете добавить что-то вроде следующего в самом начале вашего кода:

#ifdef _MSC_VER 
#define _CRT_SECURE_NO_WARNINGS 
#endif 
+0

Можете ли вы написать код? –

+0

@ Саша, ссылка, которую я тебе дал, должна была покрыть ее, но конечно. Я добавил образец кода в ответ. –

+1

Я думаю, что помощники преобразования ATL облегчают код. Более того, если вы хотите сделать чек для сборников Unicode и ANSI/MBCS, я бы предпочел проверить с препроцессором _at compile-time_ с помощью макросов препроцессора 'UNICODE/_UNICODE' (которые' # define''d в сборках Unicode) вместо проверки во время выполнения с 'if (sizeof (TCHAR) == sizeof (char)) ...'. –

2

LPTSTR означает TCHAR* (расширение те Win32-аббревиатуры typedefs могут облегчить их понимание). TCHAR расширяется до char в сборках ANSI/MBCS и до wchar_t в сборниках Unicode (которые должны быть стандартными в эти дни для лучшей поддержки интернационализации).

В этой таблице приведены TCHAR разложения в ANSI/MBCS и Юникода строит:

  | ANSI/MBCS |  Unicode 
    --------+----------------+----------------- 
    TCHAR |  char  |  wchar_t 
    LPTSTR |  char*  |  wchar_t* 
    LPCTSTR | const char* | const wchar_t* 

Так, в ANSI/MBCS строит, LPTSTR расширяется до char*; в Unicode он расширяется до wchar_t*.

char ch[MAX_PATH] - это массив из char в сборках ANSI и Unicode.

Если вы хотите преобразовать из TCHAR строки (LPTSTR) к/MBCS строки ANSI (char -На), вы можете использовать ATL string conversion helpers, например:

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; 

Обратите внимание, что Конверсия из Юникода в ANSI может быть потеряна.

Смежные вопросы