我有一个基地wchar_t*
,我期待追加另一个到底。我该怎么做?我不能使用已弃用的函数,因为我将警告视为错误。如何将两个wchar_t *连接在一起?
回答
#include <wchar.h>
wchar_t *wcsncat(wchar_t *ws1, const wchar_t *ws2, size_t n);
的wcsncat()
功能追加不超过字符串的前n个字符更指向ws2
到字符串的末尾由ws1
指向。如果在n
字符之前NULL
字符出现在ws2
之前,则直到NULL
字符的所有字符都会附加到ws1
。 ws2
的第一个字符将覆盖ws1
的终止NULL
字符。终止字符始终附加到结果中,如果用于复制的对象重叠,则行为未定义。
ws1
是空终止目标字符串。
ws2
是空终止的源字符串。
n
是字符追加数。
已声明已弃用。 – Chad 2009-12-06 17:49:49
如上所述,最便携的方法是使用wcsncat
,但听起来像您致力于Visual C++ 2005及更高版本的“安全CRT”功能。 (只有Microsoft已经“弃用”这些功能。)如果是这种情况,请使用在string.h中声明的wcsncat_s
。
为什么不首先使用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*
。
或'const wchar_t * concatenation = s.c_str();'取决于 - 但是我会做的第一件事就是将它们包装成字符串类型。 – 2009-12-06 18:08:34
+1,人们应该在适当的时候使用STL。 – DaMacc 2009-12-06 18:12:58
使用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 */ }
- 1. 将两个列表连接在一起
- 2. 将两个类连接在一起
- 3. 如何在Java中将两个JFrames Windows连接在一起
- 4. 如何在C#中将两个表单连接在一起?
- 5. 如何在SQL中将两个表连接在一起?
- 6. 如何将两个实体对象连接在一起?
- 7. 如何将两个码头集装箱连接在一起?
- 8. 如何将两个AFP文件连接在一起
- 9. 如何将两个离子应用程序连接在一起?
- 10. 如何修复将两个表连接在一起的错误
- 11. 如何将这两个html表连接在一起?
- 12. 如何将两个计数查询连接在一起?
- 13. 我可以将两个连接资源连接在一起吗?
- 14. 使用两个外键将两个表连接在一起
- 15. Julia:如何将一个矩阵的两个字符串列连接在一起
- 16. 连接两个UIScrollView的在一起
- 17. 如何将这些连接在一起?
- 18. 如何将两个wav文件连接成一个接一个
- 19. 如何将两个连接在LINQ
- 20. 如何在vim中一起连接两个命令?
- 21. 如何让两个+行连接在一起? Excel 2010(示例)
- 22. 如何连接两个相同的表一起在MySQL
- 23. 如何将两个正在运行的码头集装箱连接在一起?
- 24. 如何将两个表连接在一起,并将两个表都组合成一列?
- 25. R ggplot2:将线图的两个部分连接在一起
- 26. 无法将两个ViewController连接在一起
- 27. iPhone/iPad SDK - 将两个或更多视频连接在一起
- 28. 将两个mbtiles文件连接在一起
- 29. 将两个形状连接在一起,Silverlight 2
- 30. Java将两个字符串连接在一起charAt
如果你的意思为“过时”,微软不喜欢的标准功能,然后不要打扰。你真的想要锁定供应商,但仍然没有绝对的安全性吗?只需在项目文件中定义'_CRT_SECURE_NO_WARNINGS',VC++就会闭嘴。 – MSalters 2009-12-07 11:18:43