C++:将LPTSTR转换为char数组[重复]
-
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是一个(非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
手段 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