C++ Print String16 in Android


簡短的寫法是丟給String8再取出來

String16 str("string16 for printing");
LOGE( "I print a string16 '%s' ", String8(str).string());

成員函數string()會將它內部的char8_t* buffer位址回傳給你,LOGE就可以印出來

這個string()回傳的位址不是永久的,所以請不要保存這個位址

要注意因為是透過String8做轉換媒介,所以String8的life scope就很重要!

舉例來說,像下面這樣的程式碼,雖然只是個印字串4次跟另一個字串1次,
但是runtime時就會看到String16轉出來跑的字串有亂碼/其他字出現。

String16 str1("string16 for printing");
char* str = String8(str).string();
LOGE( "I print a string16 '%s' first time", str);
LOGE( "I print a string16 '%s' second time", str);
String8* str2 = new String8("new string8 for print");
LOGE( "I print a string16 '%s' third time", str);
LOGE( "I print a string16 '%s' forth time", str);
LOGE( "I print a string8 '%s'", test->string());
delete str2;

這原因是String8字串的scope其實只有第二行,之後就會被解構。

那一行之後能夠運作是因為OS並不會對於是放掉的空間做清理,所以資料還殘留在記憶體上,

雖然有可能可以印的出內容,但是內容是甚麼就無法確定了,也可能因此造成系統crash。

所以若你真的想要那個string buffer,就請寫出String8的變數,就可以確保運作無誤!

String16 val("test string");
String8 inst(val);

....
cout << inst.string();

...

LOGE("%s",inst.string());
...

留言

Unknown寫道…
thank you :), it helped me a lot :)