【问题标题】:C++/CX - I need to pass a Platform::String into a method that takes a const char*?C++/CX - 我需要将 Platform::String 传递给采用 const char* 的方法?
【发布时间】:2012-11-11 16:00:19
【问题描述】:

我是 C++ 新手(我是一名 C# 开发人员)。

我有一个 SQLite 包装类,它要求您将数据库名称作为 const char* 传递,但我只将它作为 Platform::String (在进行文件搜索之后)。

我似乎找不到将Platform::String 转换为const char* 的方法。

我在 StackOverflow 上看到了另一个问题,它解释了为什么它不是直截了当的,但没有示例代码或端到端解决方案。

谁能帮帮我?

谢谢

【问题讨论】:

标签: c++ sqlite windows-8 windows-runtime c++-cx


【解决方案1】:

免责声明:我对 C++/CX 知之甚少,我的答案基于文档 here

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());

或者,您可能会发现更容易忽略 Microsoft 关于如何处理字符串的想法,而改用 std::string

【讨论】:

    猜你喜欢
    • 2012-11-12
    • 2020-12-11
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    相关资源
    最近更新 更多