你如何连接两个wchar_t *?

时间:2009-12-06 17:30:19

标签: c++

我有一个基地wchar_t*,我希望将另一个追加到最后。我该怎么做?我不能使用已弃用的函数,因为我将警告视为错误。

4 个答案:

答案 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字符以外的所有字符都会附加到ws1ws2的第一个字符会覆盖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',即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 */
}