2017-01-03 80 views
0

我想轉換爲wchar_t *爲char *和我的記憶中浪費的解決辦法是大小需要構建一個char *出* wchar_t的在c

char *wstrtostr(const wchar_t *text) { 
    size_t size = wcslen(text)*sizeof(wchar_t)+1; 
    char *sa = malloc(size); 
    wcstombs(sa,text,size); 
    return sa; 
} 

的字符可能是單字節或多字節和wcslen會計算它們,不管它們的字符大小是否相同。

問題是我們如何確定wchar的等效字符大小,以便我們可以爲此特定問題構建wcslen的替代方案,從而確定構建char指針所需的大小?

+4

爲什麼不閱讀'wcstombs'手冊? –

+1

加起來[* Kerrek SB *的評論](http://stackoverflow.com/questions/41441050/size-needed-to-construct-a-char-out-of-wchar-t-in-c# comment70088254_41441050):http://man7.org/linux/man-pages/man3/wcstombs.3.html – alk

回答

2

要回答您提出的問題,您可以反覆致電wcstombs並使用bytes緩慢增加,直至獲得存儲的內容。然而,不知道如何有效率,雖然你似乎想要做的。也許你會想要一個不同的方法:

分配一些內存。致電wcsrtombs。如果src最終不是NULL,那麼您的內存已用盡,所以realloc並再次從上次停止的位置調用wcsrtombs

根據您的數據,您可以構建一個啓發式,以便首先分配多少內存,以便重新分配很少。

更新:事實證明,如果您在Linux下運行,並且不需要可移植性或C99合規性,則存在另一種方法。如果您調用wcstombs並將NULL作爲目標,那麼它將返回本來需要的字節數。然後您可以分配這個字節數並再次撥打wcstombs。哪種方法會更好取決於你的情況,具體而言,我想象的是字符串的長度以及你的啓發式在猜測正確長度時的優勢。另外,僅僅爲了重申一下,如果你的代碼需要可移植,那麼這是一個非標準的API。感謝melpomene的指針。

第二次更新:wcsrtombs支持,根據C99,其dest指針設置爲NULL以獲得輸出緩衝區所需的長度。感謝Story Teller。所以你可以用NULL調用一次,然後再用適當大小的緩衝區再調用一次。

+1

我不確定這是否是關於使用NULL作爲dst的Linux擴展的神祕參考?如果是這樣的話,如果你只針對Linux(也可能是其他平臺)並且不需要可移植性,那麼在Linux手冊頁中記錄另一種方法會更有幫助。它沒有記錄在c99規範中,當然也沒有其他系統的手冊頁。 OP沒有說他們也在使用Linux。 – user133831

+0

你是對的;我道歉。你可以補充說明你的答案?我不知道這是Linux特有的。我會刪除我的評論。 – melpomene

+1

['wcsrtombs'](http://en.cppreference.com/w/c/string/multibyte/wcsrtombs)*是*標準化的,如果'dest'爲NULL,則返回大小。所以你不需要迭代。您可以先使用它來計算大小。並在轉換之前分配正確的金額。 – StoryTeller

相關問題