首页 > 解决方案 > 将 std::string 转换为 const tchar*

问题描述

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

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

现在我想将字符串转换为上面的类型,但我不知道如何。此链接提供了将字符串转换为 tchar,但不是 const tchar* 的解决方案。这个另一个链接显示了如何将字符串转换为 tchar*,而不是 const tchar*,并且内存分配对我来说是第二个解决方案的问题。正如您可能会说的,我对 c++ 非常陌生,所以任何教育提示也将不胜感激。

标签: c++stringtype-conversion

解决方案


一种适用于所有 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。(假设您不使用显式转换来引入或删除constness)。

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

两种情况下的注意事项

  1. 如果指针 (tchartchar2) 各自的容器 (convertedconverted2) 被调整大小或它们不再存在,则指针 ( 和 ) 将失效。例如,不要使用tcharif指向的数据converted已经超出范围,因为数据tchar点 at will 不再存在。
  2. 使用指针运行结束只是未定义的行为(使用指针时没有神奇的调整大小)。

推荐阅读