可能重复:
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;
}
提前致谢。
答案 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 );
此外,此链接可以提供帮助:
答案 1 :(得分:2)
首先,您定义了char* ch[MAX_PATH]
而不是char ch[MAX_PATH]
。
关于你的问题,LPTSTR(指向TCHAR字符串的长指针)等同于LPWSTR
(w_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的转换可能是有损的。