2009-12-06 41 views
9

我有一個基地wchar_t*,我期待追加另一個到底。我該怎麼做?我不能使用已棄用的函數,因爲我將警告視爲錯誤。如何將兩個wchar_t *連接在一起?

+0

如果你的意思爲「過時」,微軟不喜歡的標準功能,然後不要打擾。你真的想要鎖定供應商,但仍然沒有絕對的安全性嗎?只需在項目文件中定義'_CRT_SECURE_NO_WARNINGS',VC++就會閉嘴。 – MSalters 2009-12-07 11:18:43

回答

6
#include <wchar.h> 

wchar_t *wcsncat(wchar_t *ws1, const wchar_t *ws2, size_t n); 

wcsncat()功能追加不超過字符串的前n個字符更指向ws2到字符串的末尾由ws1指向。如果在n字符之前NULL字符出現在ws2之前,則直到NULL字符的所有字符都會附加到ws1ws2的第一個字符將覆蓋ws1的終止NULL字符。終止字符始終附加到結果中,如果用於複製的對象重疊,則行爲未定義。

ws1

是空終止目標字符串。

ws2

是空終止的源字符串。

n

是字符追加數。

+2

已聲明已棄用。 – Chad 2009-12-06 17:49:49

5

如上所述,最便攜的方法是使用wcsncat,但聽起來像您致力於Visual C++ 2005及更高版本的「安全CRT」功能。 (只有Microsoft已經「棄用」這些功能。)如果是這種情況,請使用在string.h中聲明的wcsncat_s

12

爲什麼不首先使用std::wstring

wchar_t *ws1 = foo(), *ws2 = bar(); 
std::wstring s(ws1); 
s += std::wstring(ws2); 
std::wcout << s << std::endl; 

如果需要的話,std::wstring::c_str()給你訪問結果作爲const wchar_t*

+1

或'const wchar_t * concatenation = s.c_str();'取決於 - 但是我會做的第一件事就是將它們包裝成字符串類型。 – 2009-12-06 18:08:34

+1

+1,人們應該在適當的時候使用STL。 – DaMacc 2009-12-06 18:12:58

1

使用wstrncat/wcsncat函數很好,但我認爲這些安全字符串函數的最佳版本是由Open BSD創建的'l'函數,即strlcatwstrlcat。使用'n'版本,您最終可能會得到一個沒有空終止符的字符串,因此您仍然可能遇到安全問題。另外某些實現會將緩衝區中未使用的空間置零,這可能會使事情減慢一點。

維基百科頁面上有這些功能的更多信息:Strlcpy et al.。唯一的問題是這些不在標準庫中,所以你必須自己將代碼包含在你的項目中。

這裏的源到wstrlcat功能:

 
/* 
* Appends src to string dst of size siz (unlike strncat, siz is the 
* full size of dst, not space left). At most siz-1 characters 
* will be copied. Always NUL terminates (unless siz = siz, truncation occurred. 
*/ 
size_t wstrlcat(wchar_t *dst, const wchar_t *src, size_t siz) 
{ 
     wchar_t *d = dst; 
     const wchar_t *s = src; 
     size_t n = siz; 
     size_t dlen; 

     /* Find the end of dst and adjust bytes left but don't go past end */ 
     while(n-- != 0 && *d != L'\0') { 
       d++; 
     } 

     dlen = d - dst; 
     n = siz - dlen; 

     if (n == 0) { 
       return(dlen + wcslen(s)); 
     } 

     while(*s != L'\0') 
     { 
       if(n != 1) 
       { 
         *d++ = *s; 
         n--; 
       } 
       s++; 
     } 

     *d = '\0'; 
     return(dlen + (s - src));  /* count does not include NUL */ 
} 
相關問題