我是 C++ 新手(我是 ac# 开发人员)。
我有一个 SQLite 包装器类,它要求您将数据库名称作为 a 传递const char*
,但是我只将它作为 a Platform::String
(在进行文件搜索之后)。
我似乎无法找到将其转换Platform::String
为const char*
.
我在 StackOverflow 上看到了另一个问题,解释了为什么它不是直截了当的,但没有示例代码或端到端解决方案。
谁能帮我 ?
谢谢
我是 C++ 新手(我是 ac# 开发人员)。
我有一个 SQLite 包装器类,它要求您将数据库名称作为 a 传递const char*
,但是我只将它作为 a Platform::String
(在进行文件搜索之后)。
我似乎无法找到将其转换Platform::String
为const char*
.
我在 StackOverflow 上看到了另一个问题,解释了为什么它不是直截了当的,但没有示例代码或端到端解决方案。
谁能帮我 ?
谢谢
免责声明:我对 C++/CX 知之甚少,我的答案基于此处的文档。
该类String
包含 16 位 Unicode 字符,因此您无法直接获取指向 8 位char
类型字符的指针;您需要转换内容。
如果已知字符串仅包含 ASCII 字符,则可以直接转换:
String s = whatever();
std::string narrow(s.Begin(), s.End());
function_requiring_cstring(narrow.c_str());
否则,字符串将需要翻译,这会变得相当麻烦。以下可能会做正确的事情,将宽字符转换为窄字符的多字节序列:
String s = whatever();
std::wstring wide(s.Begin(), s.End());
std::vector<char> buffer(s.Length()+1); // We'll need at least that much
for (;;) {
size_t length = std::wcstombs(buffer.data(), wide.c_str(), buffer.size());
if (length == buffer.size()) {
buffer.resize(buffer.size()*2);
} else {
buffer.resize(length+1);
break;
}
}
function_requiring_cstring(buffer.data());
或者,您可能会发现更容易忽略微软关于如何处理字符串的想法,std::string
而是使用它。