Więcej
Jak wykonać konkatenację stałych/literalnych łańcuchów w C?
Pracuję w C i muszę połączyć kilka rzeczy.
W tej chwili mam to:
message = strcat("TEXT ", var);
message2 = strcat(strcat("TEXT ", foo), strcat(" TEXT ", bar));
Teraz, jeśli masz doświadczenie w C I'm sure you realize that this gives you a segmentation fault when you try to run it. Więc jak mogę to obejść?
321
3
W C, "łańcuchy" są po prostu zwykłymi tablicami
char
. Dlatego nie można'bezpośrednio konkatenować ich z innymi "łańcuchami".Możesz użyć funkcji
strcat
, która dołącza łańcuch wskazany przezsrc
do końca łańcucha wskazanego przezdest
:Oto przykład przykład z cplusplus.com:
Dla pierwszego parametru należy podać sam bufor docelowy. Bufor docelowy musi być buforem w postaci tablicy znaków. Np:
char buffer[1024];
.Upewnij się, że pierwszy parametr ma wystarczająco dużo miejsca, aby przechować to, co próbujesz do niego skopiować. Jeśli jest to dla Ciebie dostępne, bezpieczniej jest używać funkcji takich jak:
strcpy_s
istrcat_s
, gdzie jawnie musisz określić rozmiar bufora docelowego.Uwaga: Literał łańcuchowy nie może być użyty jako bufor, ponieważ jest to stała. Tak więc, zawsze musisz przydzielić tablicę znaków dla bufora.
Wartość zwracana przez
strcat
może być po prostu zignorowana, zwraca ona po prostu ten sam wskaźnik, który został przekazany jako pierwszy argument. Jest tam dla wygody, i pozwala na połączenie wywołań w jedną linię kodu:Tak więc twój problem można rozwiązać w następujący sposób:
Niezdefiniowanym zachowaniem jest próba modyfikacji literałów łańcuchów, czyli to, co coś takiego:
będzie próbowało to zrobić. Spróbuje ono dodać łańcuch
name
na koniec literału"Hello, "
, który nie jest dobrze zdefiniowany.Spróbuj czegoś takiego. Osiąga to, co wydaje się, że próbujesz zrobić:
Tworzy to obszar bufora, który jest dozwolony do modyfikacji, a następnie kopiuje do niego zarówno literał łańcuchowy, jak i inny tekst. Po prostu uważaj na przepełnienia bufora. Jeśli kontrolujesz dane wejściowe (lub sprawdzasz je wcześniej), to dobrze jest używać buforów o stałej długości, tak jak ja to zrobiłem.
W przeciwnym razie powinieneś użyć strategii łagodzących, takich jak przydzielanie wystarczającej ilości pamięci ze sterty, aby upewnić się, że możesz sobie z tym poradzić. Innymi słowy, coś w stylu:
Pierwszy argument strcat() musi być w stanie pomieścić wystarczająco dużo miejsca dla konkatenowanego łańcucha. Zatem zaalokować bufor z wystarczającą ilością miejsca, aby otrzymać wynik.
strcat() połączy drugi argument z pierwszym, i zapisze wynik w pierwszym argumencie, zwrócony char* jest po prostu tym pierwszym argumentem, i to tylko dla twojej wygody.
Nie otrzymujesz nowo przydzielonego ciągu znaków z pierwszym i drugim argumentem, który I'd guess you expected based on your code.