可能的重复:
将lptstr转换为char*

我需要转换一个 LPTSTR pCHAR 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是一个(非const)TCHAR字符串。取决于它是否是Unicode。LPTSTR如果不是Unicode,则为char*,如果是,则为w_char*。

如果你使用的是非Unicode字符串LPTSTR只是一个char*,否则做:

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/MBCS和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].

关于你的问题,LPTSTR(指向TCHAR字符串的长指针)相当于 LPWSTR (这是 w_char*)如果它是unicode,或者只是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