将 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 提供。 (假设您不使用显式转换来引入或删除constness)。

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

两种情况的注意事项

    如果指针(tchartchar2)各自的容器(convertedconverted2)被调整大小或它们不再存在,则它们将失效。例如,如果converted 已超出范围,则不要使用tchar 指向的数据,因为tchar 指向的数据将不再存在。 使用指针越过末尾只是未定义的行为(使用指针时不会神奇地调整大小)。

【讨论】:

感谢您的详细解释! RE "std::basic_string 不提供获取指向其数据的非const 指针的方法":这是不正确的:您可以使用@987654321 @修改内部字符串内容。 继续我上面的评论 - 此外,甚至在 C++17 中引入非const data() 方法重载之前,就可以编写 in-place std::basic_strings 使用 &amp;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 * 时出现数据丢失问题

无法从 'const std::string [3]' 转换为 'std::string'

为啥在片段中从 char* 转换为 std::string 比转换为 const char* 更可取?