Łączenie tablic char [C]

Łączenie tablic char [C]
JA
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:9
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?

Kopiuj
#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;
}
spartanPAGE
  • Rejestracja:prawie 12 lat
  • Ostatnio:około miesiąc
0
Kopiuj
/* 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.

edytowany 1x, ostatnio: spartanPAGE
JA
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:9
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

edytowany 1x, ostatnio: Jagdire
KR
  • Rejestracja:prawie 16 lat
  • Ostatnio:6 miesięcy
  • Postów:2514
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.


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 2x, ostatnio: krwq
kaczus
Tylko niech malloc zrobi na o 1 element więcej.
KR
Przeciez napisalem to w poscie dokladnie pod ta linia kodu co mu podalem :P
JA
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:9
0

Super, dziękuję bardzo za pomoc :)

kaczus
  • Rejestracja:około 10 lat
  • Ostatnio:7 dni
  • Lokalizacja:Łódź
  • Postów:1402
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.


Ogólnie na prace domowe mam stawki zaporowe. Czasem coś o programowaniu znajdzie się na mojej stronie

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.