2009-12-06 29 views
9

wchar_t* tabanım var ve sonuna başka bir tane eklemek istiyorum. Nasıl yaparım? Uyarıları hata olarak kabul ettiğim için kullanımdan kaldırılmış işlevleri kullanamıyorum.İki wchar_t * öğesini nasıl birleştiriyorsunuz?

+0

siz "deprecated" ile demek, Microsoft sevmez standart fonksiyonlar, daha sonra rahatsız etmeyin:

İşte wstrlcat işlevine kaynağıdır. Satıcının gerçekten kilitlenmesini istiyor musun, ama hala mutlak bir güvenlik yok mu? Sadece proje dosyasında '_CRT_SECURE_NO_WARNINGS' öğesini tanımlayın ve VC++ kapanacaktır. – MSalters

cevap

6
#include <wchar.h> 

wchar_t *wcsncat(wchar_t *ws1, const wchar_t *ws2, size_t n); 

wcsncat() fonksiyon ws1 tarafından işaret dizisinin sonuna ws2 tarafından işaret dizgenin ilk n karakterden fazla ekler. NULL karakteri, n karakterlerinden önce ws2 karakterleri içeriyorsa, NULL karakterine kadar olan tüm karakterler ws1'a eklenir. ws2'un ilk karakteri, ws1'un sonlandırıcısı NULL karakterinin üzerine yazılır. Bir NULL sonlandırma karakteri her zaman sonuca eklenir ve kopyalama için kullanılan nesneler çakışıyorsa, davranış tanımsızdır.

ws1

boş sonlandırılmış hedef dize mi.

ws2

boş sonlandırılmış kaynak dizesi var.

n

eklemek karakter sayısı mı.

+2

Kullanımdan kaldırılmış ilan edildi. – Chad

5

Bunu yapmanın en taşınabilir yolu, yukarıda belirtildiği gibi wcsncat'dur, ancak Visual C++ 2005 ve sonraki sürümlerinde "güvenli CRT" özelliklerine bağlı olduğunuza benziyor. (Sadece Microsoft bu işlevleri kullanımdan kaldırmıştır.) Durum buysa, string.h dosyasında bildirilen wcsncat_s kullanın.

12

Neden ilk etapta bir std::wstring kullanmayın: Gerekirse, std::wstring::c_str() bir const wchar_t* olarak sonuç erişim sağlar

wchar_t *ws1 = foo(), *ws2 = bar(); 
std::wstring s(ws1); 
s += std::wstring(ws2); 
std::wcout << s << std::endl; 

.

+1

veya 'const wchar_t * concatenation = s.c_str();' bağımlı - ama evet yapacağım ilk şey onları bir dize türünde sarmalamak. –

+1

+1, insanlar uygun yerlerde STL kullanmalıdır. – DaMacc

1

wstrncat/wcsncat işlevlerini kullanmak iyidir, ancak bu güvenli dize işlevlerinin en iyi sürümünün Open BSD, yani strlcat ve wstrlcat tarafından oluşturulan "l" olduğunu düşünüyorum. 'N' sürümleriyle, null bir sonlandırıcıya sahip olmayan bir dizeyle bitirebilirsiniz, böylece hala güvenlik sorunlarınız olabilir. Ayrıca bazı uygulamalar, tampondaki kullanılmayan alanı sıfırlar ve bu da işleri yavaşlatır.

wikipedia sayfası, bu işlevler hakkında daha fazla bilgiye sahiptir: Strlcpy et al.. Tek sorun, bunlar standart kütüphanelerde bulunmamasıdır, bu nedenle kodu projenize kendiniz eklemeniz gerekir.

 
/* 
* 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 */ 
} 
İlgili konular