C ++:将LPTSTR转换为char数组

时间:2012-05-21 09:10:40

标签: c++ c visual-studio lptstr

  

可能重复:
  Convert lptstr to 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;
}

提前致谢。

3 个答案:

答案 0 :(得分:6)

LPTSTR是(非常量)TCHAR字符串。取决于它是否是Unicode,它出现。如果不是Unicode,则LPTSTR为char *,如果不是,则为w_char *。

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

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

此外,此链接可以提供帮助:

Convert lptstr to char*

答案 1 :(得分:2)

首先,您定义了char* ch[MAX_PATH]而不是char ch[MAX_PATH]

关于你的问题,LPTSTR(指向TCHAR字符串的长指针)等同于LPWSTRw_char*),如果它是unicode,或者只是LPSTR({{1如果不是。)您可以使用this link参考每种情况下的转化。

编辑:要切入追逐,这里有一些代码:

char*

编辑2 :在Windows中,我建议使用if (sizeof(TCHAR) == sizeof(char)) // String is non-unicode strcpy(ch, (char*)(p)); else // String is unicode wcstombs(ch, p, MAX_PATH); 代替TCHAR。它会让你头疼。

编辑3 :作为旁注,如果您想阻止Visual Studio充斥着有关不安全功能的警告,您可以在代码的最开头添加以下内容:< / p>

char

答案 2 :(得分:2)

LPTSTR表示TCHAR*(扩展那些Win32首字母缩略词typedef可以更容易理解它们)。 TCHAR在ANSI / MBCS版本中扩展为char,在Unicode版本中扩展为wchar_t(这些日期应该是默认值,以便更好地支持国际化)。

此表总结了ANSI / MBCS和Unicode版本中的 TCHAR扩展

          |   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]是ANSI和Unicode版本中char的数组。

如果您想要从TCHAR字符串(LPTSTR)转换为ANSI / MBCS字符串(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; 。)

示例代码如下:

{{1}}

另请注意,从Unicode到ANSI的转换可能是有损的