Tôi có một cơ sở wchar_t*
và tôi đang tìm cách thêm một số khác vào cuối. Tôi phải làm nó như thế nào? Tôi không thể sử dụng các chức năng không dùng nữa vì tôi đang xử lý cảnh báo dưới dạng lỗi.Làm thế nào để bạn nối hai wchar_t * lại với nhau?
Trả lời
#include <wchar.h>
wchar_t *wcsncat(wchar_t *ws1, const wchar_t *ws2, size_t n);
Chức năng wcsncat()
gắn thêm không quá n ký tự đầu tiên của chuỗi được trỏ đến bởi ws2
đến cuối của chuỗi được trỏ đến bởi ws1
. Nếu ký tự NULL
xuất hiện trong ws2
trước khi n
ký tự, tất cả các ký tự tối đa NULL
ký tự được thêm vào ws1
. Ký tự đầu tiên của ws2
sẽ ghi đè ký tự kết thúc NULL
của ws1
. Một ký tự chấm dứt NULL
luôn được nối vào kết quả và nếu các đối tượng được sử dụng để sao chép chồng lên nhau, hành vi này không được xác định.
ws1
Là chuỗi đích đã hủy không.
ws2
Là chuỗi nguồn bị chấm dứt null.
n
Là số ký tự để nối thêm.
Nó đã được tuyên bố không được chấp nhận. – Chad
Cách di động nhất để thực hiện điều này là wcsncat
như đã đề cập ở trên, nhưng có vẻ như bạn đã cam kết với các tính năng "bảo mật CRT" của Visual C++ 2005 trở lên. (Chỉ Microsoft có "không được chấp nhận" các chức năng đó.) Nếu trường hợp đó xảy ra, hãy sử dụng wcsncat_s
, được khai báo bằng chuỗi.h.
Tại sao không sử dụng một std::wstring
ở nơi đầu tiên:
wchar_t *ws1 = foo(), *ws2 = bar();
std::wstring s(ws1);
s += std::wstring(ws2);
std::wcout << s << std::endl;
Nếu cần thiết, std::wstring::c_str()
cung cấp cho bạn truy cập vào kết quả như một const wchar_t*
.
hoặc 'const wchar_t * concatenation = s.c_str();' phụ thuộc - nhưng có điều đầu tiên tôi muốn làm là bọc chúng trong một kiểu chuỗi. –
+1, mọi người nên sử dụng STL nếu thích hợp. – DaMacc
Sử dụng các chức năng wstrncat/wcsncat
là tốt, nhưng tôi nghĩ phiên bản tốt nhất của các chức năng chuỗi an toàn này là các 'l' được tạo bởi BSD mở, tức là strlcat
và wstrlcat
. Với các phiên bản 'n', bạn có thể kết thúc bằng một chuỗi không có dấu kết thúc null vì vậy bạn vẫn có thể có vấn đề về bảo mật. Ngoài ra một số triển khai sẽ không ra không gian không sử dụng trong bộ đệm mà có thể làm chậm những thứ xuống một chút.
Trang wikipedia có thêm một số thông tin về các chức năng sau: Strlcpy et al.. Vấn đề duy nhất là đây không phải là trong các thư viện chuẩn, do đó bạn phải đưa mã vào dự án của mình.
Đây là nguồn để một hàm 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. Làm cách nào để chuỗi hai UIGestureRecognizers lại với nhau?
- 2. Làm thế nào để buộc JS làm toán thay vì đặt hai chuỗi lại với nhau
- 3. Làm thế nào để chuyển đổi wchar_t * để const char *
- 4. Làm thế nào để bạn sao chép hiệu quả BSTR vào wchar_t []?
- 5. Làm thế nào để bạn kết hợp hai repo git?
- 6. Cuộn hai UITableViews lại với nhau
- 7. Làm thế nào để nối hai tệp tcpdump (tệp pcap)
- 8. Làm thế nào để đặt hai hộp div cạnh nhau
- 9. Làm thế nào để bạn nối chuỗi trong cmake
- 10. Kết nối hai thiết bị UIScrollView với nhau
- 11. Làm thế nào để nối hai ma trận trong Python?
- 12. Làm thế nào để nối hai nguyên tử/chuỗi?
- 13. Làm thế nào để nối hai lịch sử git?
- 14. Làm thế nào để bạn nối văn bản trong CodeMirror
- 15. Làm thế nào bạn có thể nối hai tệp lớn với rất ít không gian đĩa trống?
- 16. hai chiều một chiều có thể nối với nhau
- 17. QChar để wchar_t
- 18. Làm thế nào để nối hai chuỗi trong sql và pad một chuỗi với 0?
- 19. Làm thế nào để thay thế hai hoặc nhiều chuỗi với nhau?
- 20. Làm thế nào để bạn sử dụng telnet để kiểm tra kết nối với Oracle?
- 21. Làm thế nào để bạn làm việc với một mảng jQuery hoãn lại?
- 22. Làm thế nào để bạn đặt hai divs bên cạnh nhau để họ điền vào không gian có sẵn
- 23. Làm thế nào để buộc Windows để kết nối lại với ổ đĩa mạng
- 24. Làm thế nào để hai chuỗi giống nhau không bằng nhau?
- 25. Làm thế nào để làm điều ngược lại với diff?
- 26. Bạn có thể gộp các dll lại với nhau không?
- 27. Làm thế nào để bạn chỉ định một số cổng khác nhau trong SQL Management Studio?
- 28. Làm thế nào để so sánh hai Danh sách <String> với nhau?
- 29. Làm thế nào để in hai mảng cạnh nhau với tập lệnh bash?
Nếu bạn có ý nghĩa với "phản đối", các chức năng tiêu chuẩn mà Microsoft không thích, thì đừng bận tâm. Bạn có thực sự muốn có nhà cung cấp lock-in, nhưng vẫn không an toàn tuyệt đối? Chỉ cần định nghĩa '_CRT_SECURE_NO_WARNINGS' trong tệp dự án và VC++ sẽ tắt. – MSalters