基本上我有一個功能,大致看起來像這樣,我需要退出。從函數返回動態C風格的字符串?
const char* UTF16ToUTF8(const wchar_t *in) {
int tmp = wcslen(in);
int size_needed = WideCharToMultiByte(CP_UTF8, 0, &in[0], (size_t)tmp, NULL, 0, NULL, NULL);
std::vector<char> out;
out.resize(size_needed);
WideCharToMultiByte(CP_UTF8, 0, &in[0], (size_t)tmp, &out[0], size_needed, NULL, NULL);
return &out[0];
}
顯然在返回時得到解除引用。我有什麼選擇?我需要能夠像這樣調用這個函數。我絕對會喜歡留在棧上。
utf8outputfile << UTF16ToUTF8(wchar_tString) << endl;
fprintf(utf8outputfile, "%s", UTF16ToUTF8(L"Mmm Mmm Unicode String κόσμε"));
return UTF16ToUTF8(wchar_tString);
我不知道你可以用'std :: vecor'來做到這一點。是否將'&out [0]'傳遞給'WideCharToMultiByte'以多字節安全?好形式? – Sodved
@Sodved no - 它會爆炸,因爲當函數返回時矢量將被破壞(並且釋放後備分配)。因此,這個函數的結果永遠不會指向有效的分配。如果向量要超過函數,那麼你當然可以使用char向量來表示一個字符串(儘管在大多數情況下std :: string更合適)。 – justin
@Sodved然而,矢量確保連續分配。把'&vec [0]'當作一個c數組是很好的。 – justin