Łączenie tablic char [C]

0

Witam,
czy mógłby mi ktoś podpowiedzieć, dlaczego po połączeniu dwóch tablic znaków w jednej alokowanej dynamicznie poniższy kod dodaje jeszcze jakieś krzaki na końcu?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    
    char* wynik;
    char tab1[]="pierwszy";
    char tab2[]="drugi";
        
    wynik =malloc((strlen(tab1)+strlen(tab2))*sizeof(char));


    int g;
        for(g=0; g<strlen(tab1); ++g)
            wynik[g]=tab1[g];


        for(int w=0; w<strlen(tab2); ++g, ++w)
            wynik[g]=tab2[w];


    printf("%s", wynik);

    free(wynik);
    return 0;
}
0
/* strcat example */
#include <stdio.h>
#include <string.h>

int main(){
    char str[80];
    strcpy(str,"these ");
    strcat(str,"strings ");
    strcat(str,"are ");
    strcat(str,"concatenated.");
    puts(str);
    return 0;
}

Co do twojego kodu: w ten sposób pomijasz znak kończący łańcuch, '\0', więc czyta śmieci aż taki znak znajdzie.

0

zdaję sobie sprawę z możliwości zrobienia tego za pomocą strcat, strcpy. Jednak interesuje mnie co w tym kodzie "nie działa" bo wydawał mi się poprawny

1

zrob cos takiego i bedzie dobrze:
wynik[strlen(tab1) + strlen(tab2)] = '\0';
i w mallocu zaalokuj o 1 znak wiecej.

string i tablica to nie do konca to samo i najprostsza roznica jest taka, ze c-string jest o jeden znak dluzszy niz tablica zawierajaca takie same znaki. Zeby funkcje wypisujace na ekran wiedzialy gdzie sie taka tablica konczy dodaje sie na koncu 0.

0

Super, dziękuję bardzo za pomoc :)

0

Jak chcesz żeby działało to szybciej - to odczytaj strlen(tablica) do jakiejś zmiennej, bo nie zawsze kompilator to dobrze zoptymalizuje, a każdorazowe obliczanie długości kosztuje. Druga kwestia, to zamiast kopiowania po znaku memcpy zadziała szybciej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1