c++ - 将 std::string 转换为 const tchar*
问题描述
我有一个函数,它接受一个名为 arrayOfStrings 的参数,定义如下:
const TCHAR* arrayOfStrings[] = { L"Test" };
现在我想将字符串转换为上面的类型,但我不知道如何。此链接提供了将字符串转换为 tchar,但不是 const tchar* 的解决方案。这个另一个链接显示了如何将字符串转换为 tchar*,而不是 const tchar*,并且内存分配对我来说是第二个解决方案的问题。正如您可能会说的,我对 c++ 非常陌生,所以任何教育提示也将不胜感激。
解决方案
一种适用于所有 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
ness)。
在 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()
const
vector
两种情况下的注意事项
- 如果指针 (
tchar
和tchar2
) 各自的容器 (converted
或converted2
) 被调整大小或它们不再存在,则指针 ( 和 ) 将失效。例如,不要使用tchar
if指向的数据converted
已经超出范围,因为数据tchar
点 at will 不再存在。 - 使用指针运行结束只是未定义的行为(使用指针时没有神奇的调整大小)。
推荐阅读
- list - 如何引用在类中创建的 List<> 对象?
- php - 路由 [LaravelInstaller::welcome] 未定义
- reactjs - 在 ReactJs 中使用 jsPDF 下载 PDF 后,字体系列不会在生产中呈现
- vb.net - cefsharp 在每个请求上更改 UserAgent
- vue.js - VueJs - Element UI:如何设置不早于今天的 el-date-picker
- javascript - 如何在每个 foreach laravel 中显示不同的 ajax 响应?
- reactjs - 在 React 实时聊天应用中使用 React-window
- volttron - 如何在 volttron 天气代理中编写 name_mapping.csv 文件?或 name_mapping.csv 的语法。我正在尝试为 OpenWeatherApi 编写 name_mapping
- python - 从txt文件中的python中按字符串和整数分割行
- c# - 如何在控制器中使用多个 DBContext