仅指定第一个字符将LPCTSTR转换为char *

时间:2017-01-11 11:31:15

标签: c++ type-conversion

我是C ++的新手。在我的程序中,有一个函数必须以LPCTSTR作为参数。我想将其转换为char*。我尝试的内容如下,

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

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

4 个答案:

答案 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_tchar)并坚持使用它是非常有用的,因为尝试使用TCHAR时,试图支持两者,可能会让你有些头疼。公平地说,今天,您可以安全地使用wchar_t(或WCHAR,因为从您使用的当前类型开始,我怀疑您使用的是Windows标头。)

您遇到的问题是因为投射指针对其内容没有任何影响。而且,因为,通常 wchar_t的大小为2个字节,而char的大小为1个字节,存储的值适合charwchar_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 - 否则。