我是C ++的新手。在我的程序中,有一个函数必须以LPCTSTR
作为参数。我想将其转换为char*
。我尝试的内容如下,
char* GetChar(LPCTSTR var){
char* id = (char*)var;
.....
}
但在调试过程中,我注意到只有var
的第一个字母被分配给id
我做错了什么?
(我在StackOverflow中尝试了各种关于在转向此解决方案之前将LPCTSTR转换为char *的答案。它们都不适用于我。)
的更新
我想要的是将var
指向的完整字符串视为char*
答案 0 :(得分:1)
您的代码告诉编译器将var
(这是一个指针)转换为指向字符的指针,然后将转换后的值分配给id
。它唯一转换的是指针值。它不会对var
指向,复制或转换它的内容进行任何更改。因此,您没有对字符串var
指向的任何内容。
我们不清楚你要做什么。但是你的代码并没有真正做任何事情,只是转换指针值而不改变或影响以任何方式指向的东西。
当您将LPCTSTR
(一个指向const tchar字符串的长指针)转换为char*
时,会得到一个指向char*
的{{1}}(一个const) tchar字符串)。有什么用?这有什么意义呢?
答案 1 :(得分:1)
大多数probaby LPCTSTR
都是const wchar_t*
,所以如果你把它转换为char*
(这是未定义的行为 - 因为var
可能指向文字),LSB字节( {Studio {1}}下的Visual Studio中的wchar_t为16位)为零,因此将其视为' \ 0' - 表示字符串结束。所以最后你只得到一个字符。
要将*var
转换为LPCTSTR
,您可以使用wsctombs,例如,请参阅此处:Convert const wchar_t* to const char*。
答案 2 :(得分:1)
这是我根据此处给出的其他答案找到的一个简单的解决方案。
char* GetChar(LPCTSTR var){
char id[30];
int i = 0;
while (var[i] != '\0')
{
id[i] = (char)var[i];
i++;
}
id[i] = '\0';
<强>更新强>
正如评论中所提到的,这不是解决这个问题的好方法。但如果有人遇到同样的问题并且无法理解任何其他解决方案,这将有所帮助。
因此我不会删除这个答案。
答案 3 :(得分:1)
在您的应用程序中选择一个字符集(wchar_t
或char
)并坚持使用它是非常有用的,因为尝试使用TCHAR
时,试图支持两者,可能会让你有些头疼。公平地说,今天,您可以安全地使用wchar_t
(或WCHAR
,因为从您使用的当前类型开始,我怀疑您使用的是Windows标头。)
您遇到的问题是因为投射指针对其内容没有任何影响。而且,因为,通常 wchar_t
的大小为2个字节,而char
的大小为1个字节,存储的值适合char
, wchar_t
,将wchar_t
的第二个字节设置为\0
。当您尝试将\0
- 结束的wchar_t
s字符串作为char
字符串打印时,打印函数在读取第一个字符后到达\0
字符符号,并假设它是字符串的结尾。 \0
中的wchar_t
字符长度为2个字节。
例如,字符串
LPCWSTR test = L"Hi!";
以内容存储在内存中:
48 00 69 00 21 00 00 00
如果你想将wchar_t
版本的字符串转换为char
版本,反之亦然,那么存在一些可以进行转换的函数,因为我注意到你可能正在使用Windows标头(来自LPCTSTR
define),这些功能是WideCharToMultiByte
/ MultiByteToWideChar
。
您现在可以开始思考:我没有使用wchar_t
!我正在使用TCHAR
!
通常TCHAR
通过以下方式定义:
#ifdef UNICODE
typedef WCHAR TCHAR;
#else
typedef char TCHAR;
#endif
因此,您可以在转换代码中执行类似处理:
template<int N>
bool GetChar(LPCTSTR var, char (&out)[N])){
#ifdef UNICODE
return WideCharToMultiByte (CP_ACP, 0, var, -1, out, N, NULL, NULL) != 0;
#else
return strcpy_s (out, var) == 0;
#endif
}
注意,如果函数成功,GetChar
函数的返回值为true
; false
- 否则。