Muszę połączyć dwa znaki const, takie jak te:
const char *one = "Hello ";
const char *two = "World";
Jak mam się do tego zabrać?
Przekazano mi te char*
pliki z biblioteki innej firmy z interfejsem C, więc nie mogę po prostu użyć std::string
zamiast tego.
c++
c
string-concatenation
Anthoni Caldwell
źródło
źródło
strcpy
istrcat
wywołań, pomyślałem, że zmiana tagów ma sens.Odpowiedzi:
W twoim przykładzie jeden i dwa to wskaźniki znaków, wskazujące na stałe char. Nie możesz zmienić stałych char wskazywanych przez te wskaźniki. Więc coś takiego:
nie będzie działać. Zamiast tego powinieneś mieć oddzielną zmienną (tablicę znaków) do przechowywania wyniku. Coś takiego:
źródło
strcpy(one,two);
powinno byćstrcat(one,two);
(nie to sprawia , że jest poprawne, jak słusznie zauważyłeś).sprintf(dest,"%s%s",one,two)
z kopią i zapomnieć?Droga C:
Sposób C ++:
Sposób kompilacji:
źródło
Jeśli używasz C ++, dlaczego nie używasz
std::string
zamiast ciągów w stylu C?Jeśli chcesz przekazać ten ciąg do funkcji C, po prostu przekaż
three.c_str()
źródło
Używając
std::string
:źródło
Zaktualizowano: zmieniono
string total = string(one) + string(two);
nastring total( string(one) + two );
ze względu na wydajność (unika konstrukcji ciągu drugiego i tymczasowej sumy ciągu)źródło
Jeszcze jeden przykład:
Ale jeśli wyraźnie nie chcesz lub nie możesz używać standardowej biblioteki C ++, używanie
std::string
jest prawdopodobnie bezpieczniejsze.źródło
new
. A jeśli może go użyć, powinien użyćstd::string
, jak mówisz.Wygląda na to, że używasz C ++ z biblioteką C i dlatego musisz popracować
const char *
.Proponuję zapakować je
const char *
wstd::string
:źródło
Przede wszystkim musisz stworzyć dynamiczną przestrzeń pamięci. Następnie możesz po prostu włożyć do niego dwie struny. Możesz też użyć klasy „string” w języku c ++. Stara szkoła C:
Nowy sposób C ++
źródło
Jeśli nie znasz rozmiaru sznurków, możesz zrobić coś takiego:
źródło
Możesz użyć
strstream
. Formalnie jest przestarzałe, ale wydaje mi się, że nadal jest świetnym narzędziem, jeśli potrzebujesz pracować z ciągami C.Spowoduje to zapisanie,
one
a następnietwo
do strumienia i dołączenie zakończenia\0
usingstd::ends
. W przypadku, gdy oba łańcuchy mogłyby zakończyć się zapisaniem dokładnie99
znaków - więc nie pozostałaby spacja\0
- wpisujemy jeden ręcznie na ostatniej pozycji.źródło
streambuf
wyjścia kierującego do bufora znaków używanego zostream
nie jest zbyt trudne.źródło
Łączenie dwóch stałych wskaźników znaków bez użycia polecenia strcpy w dynamicznej alokacji pamięci:
źródło