2009-12-06 44 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 */ 
} 
相关问题