1

http://www.icu-project.org/apiref/icu4c/classicu_1_1UnicodeString.html#a05777d826515a20a0b2bb8f4108f9348

StringClass & toUTF8String (StringClass &result) const

UnicodeString を UTF-8 に変換し、結果を標準文字列に追加します。

パラメータ: 結果 UTF-8 バージョンの文字列が追加される標準文字列 (または互換オブジェクト)。

戻り値: 文字列オブジェクト。

// My own function.
string toStdString(const UnicodeString& a_str)
{
    string str;
    a_str.toUTF8String(str);
    return (str);
}
int main (void)
{
    string a = toStdString("a");
    string b = toStdString("b");

    cout << "a:" << a << endl; // a
    cout << "b:" << b << endl; // b

    const char* a1 = toStdString("a").c_str();
    const char* b1 = toStdString("b").c_str();

    cout << "a1:" << a1 << endl; // b !!! Problem: Why not "a"?
    cout << "b1:" << b1 << endl; // b

    const char* a2 = a.c_str();
    const char* b2 = b.c_str();

    cout << "a2:" << a2 << endl; // a
    cout << "b2:" << b2 << endl; // b

    return (0);
}
4

2 に答える 2

1

この関数toStdStringは一時的なものを返しますが、それをどこかに保存しないと消えてしまいます。

この声明では

const char* a1 = toStdString("a").c_str();

この一時オブジェクトにポインタを格納します。ステートメントの最後で、この一時的な文字列は再び破棄され、ポインターはどこも指しません。

後でポインターを使用しようとすると、未定義の動作が発生し、他の文字列を表示するなど、何かが起こる可能性があります。

于 2013-04-07T09:48:43.773 に答える
0

ICU とは関係ありませんが、一時オブジェクトへのポインターを格納しています。電話すると

const char* a1 = toStdString("a").c_str();

toStdStringはオブジェクトを返します。次にintstringを呼び出します。これは、その内容への一時的なポインターを返します。オブジェクトが破棄されると、ポインターは無効になるため、使用しないでください。あなたの場合、次の呼び出しはおそらく一時オブジェクトへのまったく同じポインターを返し、前のものを上書きします。c_strstringc_str

于 2013-04-07T09:53:59.273 に答える