2009-12-06 10 views
9

Ich habe eine Basis wchar_t* und ich suche nach einem anderen auf das Ende. Wie mache ich es? Ich kann keine veralteten Funktionen verwenden, da ich Warnungen als Fehler behandle.Wie verkettet man zwei wchar_t * zusammen?

+0

Wenn Sie meinen, mit „veraltet“, die Standard-Funktionen, die Microsoft nicht mag, dann nicht die Mühe. Willst du wirklich Verkäufer-Lock-in, aber immer noch keine absolute Sicherheit? Definieren Sie einfach '_CRT_SECURE_NO_WARNINGS' in der Projektdatei, und VC++ wird den Mund halten. – MSalters

Antwort

6
#include <wchar.h> 

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

Die wcsncat() Funktion anhängt nicht mehr als die ersten n Zeichen des Strings von spitz ws2 bis zum Ende des String ist, auf von ws1. Wenn ein NULL Zeichen in ws2 vor n Zeichen angezeigt wird, werden alle Zeichen bis NULL an ws1 angehängt. Das erste Zeichen von ws2 überschreibt das abschließende Zeichen NULL von ws1. Ein Abschlusszeichen wird immer an das Ergebnis angehängt, und wenn sich die zum Kopieren verwendeten Objekte überschneiden, ist das Verhalten nicht definiert.

ws1

Ist das nullterminierten Zielstring.

ws2

Ist nullterminierte Quellzeichenfolge.

n

Ist die Anzahl der Zeichen anzuhängen.

+2

Es wurde als veraltet deklariert. – Chad

5

Der portabelste Weg, dies zu tun ist wcsncat wie oben erwähnt, aber es klingt wie Sie sind verpflichtet, die "sicheren CRT" -Funktionen von Visual C++ 2005 und später. (Nur Microsoft hat diese Funktionen "veraltet".) Wenn das der Fall ist, verwenden Sie wcsncat_s, deklariert in string.h.

12

Warum nicht ein std::wstring in erster Linie verwenden:

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

Bei Bedarf std::wstring::c_str() Sie das Ergebnis als const wchar_t* Zugang gibt.

+1

oder 'const wchar_t * Verkettung = s.c_str();' abhängig - aber das erste, was ich tun würde, ist sie in einen String-Typ zu wickeln. –

+1

+1, Menschen sollten die STL wo angemessen verwenden. – DaMacc

1

die wstrncat/wcsncat Funktionen zu verwenden ist gut, aber ich denke, die beste Version dieser sicheren String-Funktionen die ‚l‘ diejenigen von Open BSD, das heißt strlcat und wstrlcat erstellt sind. Mit den 'n' Versionen können Sie mit einer Zeichenfolge enden, die keinen Nullabschluss hat, so dass Sie immer noch Sicherheitsprobleme haben können. Auch bestimmte Implementierungen werden den unbenutzten Platz im Puffer auf Null setzen, was die Dinge etwas verlangsamen kann.

Die Wikipedia-Seite enthält weitere Informationen zu diesen Funktionen: Strlcpy et al.. Das einzige Problem ist, dass diese nicht in den Standardbibliotheken enthalten sind, so dass Sie den Code selbst in Ihr Projekt einbinden müssen.

Hier ist die Quelle zu einer wstrlcat Funktion:

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