我有一个基地wchar_t*
,我希望将另一个追加到最后。我该怎么做?我不能使用已弃用的函数,因为我将警告视为错误。
答案 0 :(得分:15)
为什么不首先使用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 :(得分:7)
#include <wchar.h>
wchar_t *wcsncat(wchar_t *ws1, const wchar_t *ws2, size_t n);
wcsncat()
函数不会将ws2
指向的字符串的前n个字符追加到ws1
指向的字符串末尾。如果NULL
字符出现在ws2
字符之前n
字符,则NULL
字符以外的所有字符都会附加到ws1
。 ws2
的第一个字符会覆盖NULL
的终止ws1
字符。始终将NULL
终止字符附加到结果,如果用于复制的对象重叠,则行为未定义。
ws1
是以null结尾的目标字符串。
ws2
是以null结尾的源字符串。
n
是要追加的字符数。
答案 2 :(得分:6)
如上所述,最便携的方法是wcsncat
,但听起来你已经致力于Visual C ++ 2005及更高版本的“安全CRT”功能。 (只有Microsoft已经“弃用”了这些函数。)如果是这种情况,请使用在{h>中声明的wcsncat_s
。
答案 3 :(得分:1)
使用wstrncat/wcsncat
函数是好的,但我认为这些安全字符串函数的最佳版本是由Open BSD创建的'l',即strlcat
和wstrlcat
。使用'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 */ }