2013-04-07 71 views
1

http://www.icu-project.org/apiref/icu4c/classicu_1_1UnicodeString.html#a05777d826515a20a0b2bb8f4108f9348toUTF8String和本地參考

StringClass & toUTF8String(StringClass &結果)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); 
} 

回答

1

toStdString返回一個臨時的,它會消失,如果你不存儲在某個地方的功能。

在這份聲明中

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

你存儲一個指針到這個臨時對象。在聲明結尾,這個臨時字符串被再次銷燬,並且指針指向任何地方。

嘗試稍後使用指針會導致未定義的行爲,並可能發生任何事情,包括顯示其他字符串。

+0

好的,錯誤的。非常感謝。 – Toru 2013-04-07 09:57:52

0

它與ICU無關,而是您正在存儲指向臨時對象的指針。當你調用

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

toStdString回報string對象,然後調用c_str上int,它返回一個臨時指向其內容。 string對象被銷燬後,指針無效,不應使用。在你的情況下,下一次調用c_str可能返回完全相同的指向臨時對象的指針,覆蓋前一個。