Funkcja zwracająca wskaźnik przydzielonej pamięci.

0

Witam,

mam problem z niżej przedstawionym zadaniem.
**
Napisać funkcję posiadającą dwa parametry typu char*. Argumentami funkcji mają być tablice o elementach typu char zawierające ciągi znaków zakończone zerem. Funkcja powinna przydzielić pamięć, w której umieści kolejno: ciąg znaków znajdujący się w pierwszej tablicy, znak odstępu, ciąg znaków znajdujący się w drugiej tablicy, zero. Funkcja ma zwrócić wskaźnik wskazujący przydzieloną pamięć. Napisać program demonstrujący działanie funkcji.**

Napisałem mianowicie coś takiego:

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

int concatenation(char *firstTab, char *secondTab)
{
    char *concatenationTab;

    int nrWords=1;

    for(int i=0;;i++)
    {
        if((*(firstTab+i) !='\0') && (*(secondTab+i) != '\0'))
        {
            nrWords+=2;
        }
        else if((*(firstTab+i) !='\0') || (*(secondTab+i) != '\0'))
        {
            nrWords++;;
        }
        else{
            break;
        }
    }
    printf("%d\n",nrWords);


    concatenationTab = malloc(nrWords*sizeof(char));

    int pom=-1;
    for(int i=0; ;i++)
    {

        if((*(firstTab+i) !='\0') && (pom == -1))
        {
            *(concatenationTab+i) = *(firstTab+i);
        }
        else if((*(firstTab+i) =='\0') && (pom == -1))
        {
            pom=0;
            *(concatenationTab+i)=' ';
        }
        else if(*(secondTab+pom) !='\0')
        {
            *(concatenationTab+i) = *(secondTab+pom);
            pom++;
        }
        else if(*(secondTab+pom) =='\0')
        {
            break;
        }



    }
    printf("\nsprawdzenie0 = %c ",*concatenationTab);
    printf("\nsprawdzenie1 = %d ",&concatenationTab);
    printf("\nsprawdzenie2 = %d ",concatenationTab);

    return concatenationTab;


}

int main()
{
    char tab[20]="ten";
    char tab1[20]="teges";

    char *tabela;

    tabela = concatenation(tab,tab1);


    for(int i=0; tabela[i] != '\0' ; i++)
    {
        printf("\n%c", tabela[i]);
        printf("\nsprawdzenie3 = %d ",&tabela[i]);

    }
    printf("koniec" );


    return 0;
}

 

Nie jestem pewny tego rozwiązania bo mam wrażenie, że pomieszały mi się pojęcia wskaźnik, adres, wartość. Czy jest ktoś w stanie określić czy to zadanie jest poprawnie wykonane a w razie błędu podpowiedzieć mi w czym robię błąd?

2
char *concatenation(char *firstTab, char *secondTab)
{
    char *concatenationTab = malloc(strlen(firstTab) + 1 + strlen(secondTab) + 1);
    unsigned i = 0;
    
    for (; i < strlen(firstTab); i++)
        concatenationTab[i] = firstTab[i];
    
    concatenationTab[i++] = ' ';
    
    for (unsigned j = 0; j < strlen(secondTab); j++)
        concatenationTab[i + j] = secondTab[j];
    
    return concatenationTab;
}
1

Masz UB w swoim rozwiązaniu. "sprytnie" wymyśliłeś, aby sprawdzać oba stringi jednocześnie, ale w ten sposób jeśli pierwszy będzie krótszy od drugiego to i tak będziesz zliczał niezerowe znaki za jego końcem - co w większości przypadków oznacza UB. Ponadto w ogóle nie przewidujesz sytuacji, gdzie drugi string będzie krótszy od pierwszego. Zamiast bawić się w drzewko ifów po prostu zrób osobne pętle dla każdego ze stringów.

Idąc jeszcze dalej: zamiast wyważać otwarte koło na nowo, użyj funkcji takich jak strlen czy strcpy/strncpy.

1

Rozwiązanie na ideone, autor mówi 0 na nul w przypadku mowy o ciągu znaków. Imho bardzo mylące.

https://ideone.com/5WVC6G

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