将std :: string转换为const tchar *

时间:2018-06-28 14:10:01

标签: c++ string type-conversion

我有一个函数,它接受一个名为arrayOfStrings的参数,定义如下:

const TCHAR* arrayOfStrings[] = { L"Test" };

现在,我想将字符串转换为上面的类型,但是我不知道如何。 This link提供了一种将字符串转换为tchar而不是const tchar *的解决方案。 This other link显示了如何将字符串转换为tchar *,而不是const tchar *,第二种解决方案对我来说是内存分配的问题。您可能会说,我对c ++还是很陌生,所以任何教育技巧也将不胜感激。

1 个答案:

答案 0 :(得分:0)

一种适用于所有C ++标准的简单方法是

 #include <string>

 #include <windows.h>    //   or whatever header you're using that specifies TCHAR

 int main()
 {
       std::string test("Hello");     //   string to be converted

       //   first, if you need a const TCHAR *

       std::basic_string<TCHAR> converted(test.begin(), test.end());

       const TCHAR *tchar = converted.c_str();

       //   use tchar as it is in the required form (const)

       //   second, if you need a TCHAR * (not const)

       std::vector<TCHAR> converted2(test.begin(), test.end());

       TCHAR *tchar2 = &converted2[0];

       // use tchar2 as it is of the required form (non-const).

 }

std::basic_string并非在所有C ++标准中都提供一种获取非const指向其数据的指针的方法,但是std::vector可以提供。 (假设您没有使用显式转换来引入或消除const的本质)。

在C ++ 17和更高版本中,事情变得更简单:basic_string::data()同时具有const和非const重载,这在2017年标准之前不是这种情况。在C ++ 11之前,标准不保证basic_string中的数据是连续的(即使实现通常以这种方式实现),但是c_str()确实提供了a的第一个字符的地址。连续数组。最终结果是,在C ++ 17和更高版本中,可以使用basic_string::data()basic_string::c_str()的适当重载,而无需强制转换来更改const的性质,并且无需诉诸于vector(在所有C ++标准中都保证具有连续的元素)。

两种情况下的注意事项

  1. 如果指针(tchartchar2的各自容器(convertedconverted2)的大小已调整或不再存在,则它们将无效。例如,如果tchar超出范围,则不要使用converted指向的数据,因为指向数据的tchar不再存在。
  2. 使用指针运行到末尾是完全未定义的行为(使用指针时没有神奇的大小调整)。