仅分配第一个字符,将 LPCTSTR 转换为字符*

Only first character is assigned converting LPCTSTR to char*

本文关键字:字符 转换 LPCTSTR 分配 第一个      更新时间:2023-10-16

我对C++完全陌生。在我的程序中,有一个函数必须将LPCTSTR作为参数。我想把它转换成char*.我尝试如下,

char* GetChar(LPCTSTR var){
char* id = (char*)var;
.....
}

但是在调试时,我注意到只有var的第一个字母分配给id
我做错了什么?
(在得到这个解决方案之前,我在 StackOverflow 中尝试了关于将 LPCTSTR 转换为 char* 的各种答案。他们都不适合我。
更新
我想要的是让var指向的完整字符串被视为char*

只选择一个字符集(wchar_tchar),并在您的应用程序中坚持使用它更有用,因为尝试使用TCHAR时,尝试同时支持两者时,可能会给您带来一些头痛。公平地说,今天,您可以安全地使用wchar_t(或WCHAR,因为从您当前使用的类型来看,我怀疑您使用的是 Windows 标头)。

您遇到的问题是,强制转换指针不会对其内容产生任何影响。而且,由于通常wchar_t的大小为 2 个字节,而char的大小为 1 个字节,因此存储适合char的值,以wchar_t为单位,将wchar_t的第 2 个字节设置为个。当您尝试将 null() 结尾的wchar_ts 字符串打印为chars 字符串时,打印函数在读取第一个符号后到达字符,并假定它是字符串的末尾。wchar_t中的字符长度为 2 个字节。

例如,字符串

LPCWSTR test = L"Hi!";

存储在内存中,作为:

48 00 69 00 21 00 00 00

如果要在字符串的wchar_t版本到char版本之间进行转换,反之亦然,则存在一些可以进行转换的函数,并且由于我注意到您可能正在使用Windows标头(从LPCTSTR定义),这些功能是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- 否则。

您的代码已告诉编译器将var(这是一个指针)转换为指向字符的指针,然后将该转换后的值分配给id。它唯一转换的是指针值。它不会对var指向的内容进行任何更改、复制或转换。因此,您尚未对var指向的字符串执行任何操作。

目前尚不清楚您要做什么。但是您的代码实际上什么都不做,只是转换指针值,而不会以任何方式更改或影响指向的内容。

当您将LPCTSTR(指向 const tchar 字符串的长指针)转换为char*时,您会得到一个指向CTSTR(const tchar 字符串)的char*。那有什么用?这有什么意义?

大多数 probabyLPCTSTRconst wchar_t*,所以如果你把它投射到char*(这是未定义的行为 - 正如var可能指向文字),*var的 LSB 字节(Visual Studio 下的wchar_t是 16 位)为零,因此它被视为"\0" - 表示字符串结束。所以最后你只得到一个字符。

要将LPCTSTR转换为char*例如,您可以使用 wsctombs,请参阅此处:将常量 wchar_t* 转换为常量字符*。

这是我根据这里给出的其他答案找到的一个简单的解决方案。

char* GetChar(LPCTSTR var){
char id[30];
int i = 0;
while (var[i] != '')
{
id[i] = (char)var[i];
i++;
}
id[i] = '';

更新
如评论中所述,这不是解决此问题的好方法。但是,如果有人遇到同样的问题并且无法理解任何其他解决方案,这将有所帮助。
因此,我不会删除这个答案。