将 std::string 转换为 const tchar*
Posted
技术标签:
【中文标题】将 std::string 转换为 const tchar*【英文标题】:convert std::string to const tchar* 【发布时间】:2018-06-28 14:10:01 【问题描述】:我有一个函数,它接受一个名为 arrayOfStrings 的参数,定义如下:
const TCHAR* arrayOfStrings[] = L"Test" ;
现在我想将字符串转换为上述类型,但我不知道如何。 This link 提供了将字符串转换为 tchar 的解决方案,但不是 const tchar*。 This other link 展示了如何将字符串转换为 tchar*,而不是 const tchar*,并且内存分配对我来说是第二个解决方案的问题。您可能会说,我对 c++ 很陌生,所以任何教育提示也将不胜感激。
【问题讨论】:
很可能是TCHAR
而不是tchar
。由于您使用宽字符数组(L
前缀)对其进行初始化,因此您只能使用std::wstring
,因为TCHAR
可能是wchar_t
的typedef。
谢谢。你是对的,它是 TCHAR。已编辑。
有没有办法将 std::wstring 转换为 const TCHAR*?
@NavidNazari 如果TCHAR
真的是wchar_t
的typedef,您可以简单地使用mywstring.c_str()
来获取底层const wchar_t*
数组。同样的事情可以把std::string
转换成const char *
,但是你必须知道TCHAR
是哪个类型(char
或者wchar_t
)。
strong 建议不要在新代码中使用 TCHAR
,而是决定使用 wchar_t
并使您的项目“使用 Unicode 字符集”。自 1990 年代以来,TCHAR
可在 char/wchar_t 之间切换的双重性一直没有用处。
【参考方案1】:
一种适用于所有 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()
具有 const
和非 const
重载,这在 2017 年标准之前不是这种情况。在 C++11 之前,标准不保证 basic_string
中的数据是连续的(即使实现通常以这种方式实现),但 c_str()
确实提供了连续数组的第一个字符的地址。最终效果是,在 C++17 及更高版本中,可以使用 basic_string::data()
或 basic_string::c_str()
的适当重载,而无需强制转换来更改 const
ness,也无需诉诸 vector
(其中已保证在所有 C++ 标准中具有连续元素)。
两种情况的注意事项
-
如果指针(
tchar
和 tchar2
)各自的容器(converted
或 converted2
)被调整大小或它们不再存在,则它们将失效。例如,如果converted
已超出范围,则不要使用tchar
指向的数据,因为tchar
指向的数据将不再存在。
使用指针越过末尾只是未定义的行为(使用指针时不会神奇地调整大小)。
【讨论】:
感谢您的详细解释! RE "std::basic_string
不提供获取指向其数据的非const
指针的方法":这是不正确的:您可以使用@987654321 @修改内部字符串内容。
继续我上面的评论 - 此外,甚至在 C++17 中引入非const
data()
方法重载之前,就可以编写 in-place std::basic_string
s 使用 &s[0]
。
@Mr.C64 - 是的,好的。在 C++17 中情况发生了变化。在 C++11 之前,也不能保证 basic_string
中的数据是连续的,或者 data()
和 c_str()
给出相同的指针。我会尽快更新以反映以上是关于将 std::string 转换为 const tchar*的主要内容,如果未能解决你的问题,请参考以下文章
如何将 std::string 转换为 const char*? [复制]
将函数参数 `const char*` 转换为 `std::string_view` 是不是安全?
如何将 const uint8_t [] 转换为 std::string?
将字符串从 std::string 转换为 const char * 时出现数据丢失问题