2009-12-06 32 views
9

Mam bazę wchar_t* i czekam na dołączenie kolejnej na końcu. Jak mam to zrobić? Nie mogę używać przestarzałych funkcji, ponieważ traktuję ostrzeżenia jako błędy.Jak połączyć dwa wchar_t * razem?

+0

Jeśli masz na myśli z „przestarzałe”, standardowe funkcje, że Microsoft nie lubi, to nie przeszkadza. Czy naprawdę chcesz mieć dostęp do dostawcy, ale wciąż nie masz absolutnego bezpieczeństwa? Po prostu zdefiniuj '_CRT_SECURE_NO_WARNINGS' w pliku projektu, a VC++ się zamknie. – MSalters

Odpowiedz

6
#include <wchar.h> 

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

Funkcja wcsncat() dołącza nie więcej niż pierwsze n znaków z łańcucha wskazywanego przez ws2 do końca łańcucha wskazywanego przez ws1. Jeśli znak NULL pojawia się w ws2 przed znakami n, wszystkie znaki do numeru NULL są dołączone do ws1. Pierwszy znak ws2 nadpisuje kończący znak NULL z ws1. Znak kończący NULL jest zawsze dołączany do wyniku, a jeśli obiekty używane do kopiowania nakładają się, zachowanie jest niezdefiniowane.

ws1

Czy docelowy ciąg zakończony zerem.

ws2

Czy źródło łańcuch zakończony zerem.

n

Czy liczba znaków, aby dołączyć.

+2

Zostało ono uznane za przestarzałe. – Chad

5

Najbardziej przenośnym sposobem na to jest wcsncat, jak wspomniano powyżej, ale wygląda na to, że jesteś zaangażowany w funkcje "bezpiecznego CRT" Visual C++ 2005 i późniejszych. (Tylko Microsoft ma "przestarzałe" te funkcje.) Jeśli tak jest, użyj wcsncat_s, zadeklarowanej w string.h.

12

Dlaczego nie użyć std::wstring w pierwszej kolejności:

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

razie potrzeby std::wstring::c_str() daje dostęp do wyniku jako const wchar_t*.

+1

lub 'const wchar_t * concatenation = s.c_str();' w zależności - ale tak, pierwszą rzeczą, którą zrobię, jest zawinięcie ich w typ łańcucha. –

+1

+1, w razie potrzeby ludzie powinni używać STL. – DaMacc

1

Funkcje są dobre, ale uważam, że najlepszą wersją tych bezpiecznych funkcji łańcuchowych są te, które zostały utworzone przez Open BSD, tj. strlcat i wstrlcat. W wersjach "n" możesz otrzymać ciąg znaków, który nie ma terminatora zerowego, więc nadal możesz mieć problemy z bezpieczeństwem. Również niektóre implementacje wyzerują niewykorzystane miejsce w buforze, co może nieco spowolnić proces.

Strona wikipedia zawiera więcej informacji o tych funkcjach: Strlcpy et al.. Jedynym problemem jest to, że nie ma ich w standardowych bibliotekach, więc musisz sam dołączyć kod do swojego projektu.

Oto źródło do wstrlcat funkcji:

 
/* 
* 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 */ 
}