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?
Odpowiedz
#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ć.
Zostało ono uznane za przestarzałe. – Chad
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.
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*
.
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, w razie potrzeby ludzie powinni używać STL. – DaMacc
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 */ }
- 1. Jak połączyć dwa ArrayLists?
- 2. jak połączyć dwa LPCWSTRy?
- 3. Dwa zapytania SUM razem
- 4. Połącz dwa UIScrollView razem
- 5. Jak połączyć dwa atomy/łańcuchy?
- 6. Jak połączyć dwa wyniki jQuery
- 7. Jak połączyć dwa SwiftyJSON obiektów
- 8. Jak połączyć dwa strumienie pamięci?
- 9. Jak połączyć dwa transformatory Boost Geometry?
- 10. Three.js - łącz dwa kształty razem jako jeden?
- 11. Jak połączyć wiele list IEnumerable razem
- 12. IN r, jak połączyć podsumowanie razem
- 13. Python - Połączyć dwa słowniki, połączyć wartości ciągów?
- 14. Jak zainicjować zmienną wchar_t?
- 15. Jak połączyć dwa generatory w Pythonie?
- 16. Jak połączyć dwa ResultSets w Javie?
- 17. C++ i JMS - jak połączyć te dwa?
- 18. Jak połączyć dwa obiekty w JavaScript?
- 19. Jak połączyć dwa proci w jeden?
- 20. jak połączyć dwa Zestawienia zmian tylko (TFS)
- 21. Jak połączyć dwa ciągi (IO) w Haskell?
- 22. Jak połączyć dwa plasterki w Rust?
- 23. Jak połączyć dwa pliki tcpdump (pliki pcap)?
- 24. Jak połączyć dwa wyrażenia: result = exp1 (exp2);
- 25. Jak połączyć dwa lub więcej strumieni
- 26. Jak połączyć dwa wektory w ramce danych
- 27. Jak połączyć wynik IQueryable <T> razem?
- 28. Jak połączyć 2 ciągi zasobów razem na stronie aspx
- 29. Połączyć dwa wyniki w Powershell
- 30. PLIK * i istream: połączyć dwa?
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