C++:преобразовать LPTSTR в массив символов [дубликат]

StackOverflow https://stackoverflow.com//questions/10682394

  •  12-12-2019
  •  | 
  •  

Вопрос

Возможный дубликат:
Преобразовать lptstr в char*

Мне нужно преобразовать 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;
}

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

Это было полезно?

Решение

lptstr - это a (un-const) tchar string.Зависит ли это Unicode или не оказывается.LPTSTR является CHAR *, если не Unicode, или W_CHAR *, если так.

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

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

Также эта ссылка может помочь:

Конвертировать lptstr для char *

Другие советы

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

В этой таблице кратко представлены TCHAR расширения в сборках ANSI/MBC и Unicode:

          |   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) в строку ANSI/MBCS (char-основанный), вы можете использовать Помощники по преобразованию строк ATL, например .:

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;

Обратите также внимание, что преобразование из Unicode в ANSI может привести к потерям.

Во-первых, вы определили char* ch[MAX_PATH] вместо char ch[MAX_PATH].

Что касается вашего вопроса, ЛПЦТР (Длинный указатель на строку TCHAR) эквивалентно LPWSTR (который w_char*), если это Юникод, или просто LPSTR (char*), если это не так.Вы можете использовать эта ссылка для справки о преобразовании в каждом случае.

РЕДАКТИРОВАТЬ:Чтобы перейти к делу, вот код:

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

РЕДАКТИРОВАТЬ 2:В Windows я бы рекомендовал использовать TCHAR вместо char.Это избавит вас от головной боли.

РЕДАКТИРОВАТЬ 3:В качестве примечания: если вы хотите, чтобы Visual Studio не заваливала вас предупреждениями о небезопасных функциях, вы можете добавить что-то вроде следующего в самое начало вашего кода:

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top