2

私は c++ が初めてです (私は ac# 開発者です)。

データベース名を として渡す必要がある SQLite ラッパー クラスがありますが、 (ファイル検索を行った後)const char*としてしか持っていません。Platform::String

Platform::Stringを に変換する方法が見つからないようですconst char*

StackOverflow に関する別の質問を見たことがありますが、それは簡単ではない理由を説明していますが、サンプル コードやエンド ツー エンドのソリューションはありません。

誰でも私を助けることができますか?

ありがとう

4

1 に答える 1

2

免責事項: 私は C++/CX についてほとんど知りません。回答はこちらのドキュメントに基づいています。

このクラスには 16 ビットの Unicode 文字が含まれているため、8 ビット型の文字Stringへのポインターを直接取得することはできません。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-23T10:16:56.710 に答える