• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C - konkatenacja łańcuchów [char]

VPS Starter Arubacloud
0 głosów
7,898 wizyt
pytanie zadane 24 listopada 2015 w C i C++ przez baszmest Gaduła (3,080 p.)

Witam,

Załóżmy, że mam 
 

char *wyraz1 = " ";
char *wyraz2 = "Jakikolwiekwyraz";

Chciałbym zrobic coś w stylu

wyraz1 = wyraz1+wyraz2;

Wiem, że istnieje strcat(), ale dostaje segmentation fault gdy chce zrobić po prostu

strcat(wyraz1, wyraz2);

Mniej więcej się orientuję czemu to nie działa ( bo  wyraz1 ma za mało przydzielonej pamieci ? ), ale nie wiem jak to poprawnie zrobić. Ktoś pomoże ?

​Płacę jak za prezydenta 

2 odpowiedzi

+5 głosów
odpowiedź 24 listopada 2015 przez draghan VIP (106,230 p.)
wybrane 25 listopada 2015 przez baszmest
 
Najlepsza

char *wyraz1 = " ";

char *wyraz2 = "Jakikolwiekwyraz";

Nigdy tak nie rób. W ten sposób  przypisujesz do wskaźnika, który pozwala na zmianę wartości danych komórek w pamięci, obszar danych statycznych. Tablice znakowe, które są wpisane w kod, nie posiadają "miejsca" w pamięci. Nie można tak robić. Jak zatem...?

Albo w taki sposób:

char *wyraz1 = malloc(ILE_ZNAKOW1 * sizeof(char));
char *wyraz2 = malloc(ILE_ZNAKOW2 * sizeof(char));
strcpy(wyraz1, " ");
strcpy(wyraz2, "Jakikolwiekwyraz");

Albo tak:

char wyraz1[ILE_ZNAKOW1] = " ";
char wyraz2[ILE_ZNAKOW2] = "Jakikolwiekwyraz";

I teraz możesz użyć bezpiecznie strcat().

komentarz 24 listopada 2015 przez baszmest Gaduła (3,080 p.)

Dzięki. Takiego wyjasnienia potrzebowałem. Aczkolwiek dopiero jutro sprawdzę czy sprawdzi się to w moim programie. 
Zastosowałem chyba zbyt duży i zły skrót myślowy.  :)

dokładniej, mój problem jest nastepujacy: 
Mam **wyrazy odpowiednio zaalokowne, oraz wypelnione wyrazami

chce miec jeden *wyraz, który będzie jakimś wyrazem z **wyrazy poszerzonym o spacje "przed" i "po"

komentarz 24 listopada 2015 przez draghan VIP (106,230 p.)

Jeśli jesteś pewny, że Twoje tablice są dobrze zaalokowane i odnosisz się rzeczywiście do swoich adresów, to nie może w ogóle być mowy o błędzie naruszenia pamięci (segmentation fault).

To, co opisujesz, powinno wyglądać jakoś tak:

char wyrazy[3][100] = {"Abc", "Def", "Ghi"};
char wyraz[100];
unsigned i = 1;
strcpy(wyraz, wyrazy[i]);
strcat(wyraz, " ");

Problem w tym, ,ze malloc musi miec podana okreslona liczbe bajtów jaka ma zarezerwować, a w moim przypadku jest to zmienna wartosc

Właśnie w takich przypadkach używa się dynamicznej alokacji. ;)

komentarz 25 listopada 2015 przez baszmest Gaduła (3,080 p.)
typedef struct {
        int ile_slow;
        char **slowa;
        int *licznik;
        int **linie;
} t_skorowidz;


//fragment funkcji zainicjuj_skorowidz:
skorowidz->slowa = malloc( skorowidz->ile_slow * sizeof * skorowidz->slowa );
                skorowidz->slowa[0] = malloc( skorowidz->ile_slow * 20 * sizeof ** skorowidz->slowa); // 20 to przykładowa wartosc
                        for( i = 1 ; i < skorowidz->ile_slow ; i++)
                        {
                                skorowidz->slowa[i] = skorowidz->slowa[i-1] + 20;
                        }

Mam coś takiego. W funkcji main chciałem stworzyć *wyraz = (spacja)+skorowidz.slowa[i](spacja).
Kod wrzucam, tak tylko żeby byla jasnośc o co mi chodziło. 
Myśle jednak, że powinienem sobie już poradzić dzięki twojej pomocy :)
 

komentarz 25 listopada 2015 przez draghan VIP (106,230 p.)
Ciężko bez większego kontekstu się do tego odnieść... Ale jakbyś miał z tym jakieś problemy, to pisz. ;)
+1 głos
odpowiedź 24 listopada 2015 przez Grzyboo Nałogowiec (28,860 p.)
Musisz przydzielić pamięć do wyraz1 (funkcja malloc)
komentarz 24 listopada 2015 przez Patrycjerz Mędrzec (192,340 p.)

Tak jak kolega pisze - musisz jednoznacznie określić, jaką pamięć rezerwujesz. Wskaźnik nie jest tablicą i lepiej sobie to zapamiętać wink

komentarz 24 listopada 2015 przez baszmest Gaduła (3,080 p.)
Tak wiem, to był tylko skrót myślowy :) Problem w tym, ,ze malloc musi miec podana okreslona liczbe bajtów jaka ma zarezerwować, a w moim przypadku jest to zmienna wartosc

Podobne pytania

0 głosów
1 odpowiedź 1,108 wizyt
pytanie zadane 5 stycznia 2017 w C i C++ przez Arek Użytkownik (510 p.)
0 głosów
0 odpowiedzi 165 wizyt
0 głosów
0 odpowiedzi 313 wizyt

92,453 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...