2009-12-06 24 views
9

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?

+0

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

Trả lời

6
#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.

+2

Nó đã được tuyên bố không được chấp nhận. – Chad

5

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.

12

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*.

+1

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

+1, mọi người nên sử dụng STL nếu thích hợp. – DaMacc

1

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à strlcatwstrlcat. 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 */ 
} 
Các vấn đề liên quan