Użycie malloc w funkcji

1

Mam takie zadanie do rozwiązania. Napisz funkcję która łączy dwa dane napisy a= abc... b= ghi... i tworzy napis wynikowy c= abc..ghi.. np. dla napisów "abcd" i "ghi" wynikiem będzie "abcdghi". Napis wynikowy ma być zapisany w nowo utworzonej tablicy na stercie. dane napisy a i b podaje użytkownik. Funkcje pisze w C to co sam naskrobałem wygląda tak:

char napisy(){
	char *e,*h;
	e=(char*)malloc(e*sizeof(char));
	h=(char*)malloc(h*sizeof(char));
	if(e==NULL || h==NULL){
		printf("Brak pamieci. koniec");
		return 0;
	}
	while(scanf("%c", &e)!=1 || getchar()!='\n'){
		printf("wpisano bledne dane");
	}
		while(scanf("%c", &e)!=1 || getchar()!='\n'){
		printf("wpisano bledne dane");
	}
		return h+e;
	
}

Problem pojawia się już przy kompilacji, nie do końca wiem jak zastosować tutaj poprawnie malloca (czy powinienem wcześniej jakoś zliczyć wpisywane znaki żeby sizeof przemnożyć przez ich liczbę?) oraz jest błąd odnośnie dodawania wskaźników w return (tutaj sam nie wiem, plan byl taki żeby wskaźniki działały jak tablica)
Proszę o jakieś wskazówki jak napisać taką funkcję albo o jej przykład.
Pozdr.

0
  1. to co jest w tym malloc'u to jakiś dramt - zastanów się co tam powinno być, o co tak naprawdę chodzi w tym sizeof(coś) * inne_coś (proponuję odgórnie założyć jakąś maksymalną ilość znaków - inaczej nie zrobisz, przynajmniej na tym poziomie)
    2)h+e - tak konkatenacji(łączenia) stringów się nie robi - poczytaj o strcpy i strcat
0

mogę ci to napisać za 30zł: http://www.programy-na-zamowienie.yoyo.pl/

0

Mogę ci to napisać za darmo, ale nie teraz.

0
char* laczNapisy(const char *a, const char *b) {
     char *c = malloc(strlen(a)+strlen(b)+1);
     if (c) {
          char *d = c;
          while(*a)
              *d++ = *a++;
          while(*b)
              *d++ = *b++;
          *d = 0;
     }
     return c;
}
0

Mam chwilę, to będę wspaniałomyślny:

const int MAX_LENGTH = 500;  //max rozmiar stringów wejściowych
char* konkatenacja()
{
    char szA[MAX_LENGTH], szB[MAX_LENGTH];
    char *szW;
    printf("Podaj pierwszy string: ");
    scanf("%s", szA);
    printf("Podaj drugi string: ");
    scanf("%s", szB);

    szW = (char*)malloc(sizeof(char) * (strlen(szA) + strlen(szB) + 1));  //zaalokowanie pamięci dla stringu wyjściowego (długość pierwszego + długość drugiego + 1 miejsce na NULL
    strcpy(szW, szA);  //przekopiowanie pierwszego stringu do wynikowego
    strcat(szW, szB);  //konkatenacja drugiego stringu do wynikowego

    return szW;  //zwrócenie wskaźnika do wynikowego stringu
}

Nawet z komentarzami (ech to oczekiwanie na schłodzenie się kawy :D)

0

Dziękuje za pomoc jedno pytanie odnośnie:
szW = (char*)malloc(sizeof(char) * (strlen(szA) + strlen(szB) + 1)); otóż:
rozumiem, że malloc alokuje miejsce w pamięci wielkości szA + szB +1 miejsce na znak NULL, teraz rozumuje w ten sposób, że w pamięci robi się taka tablica(czyli to miejsce gdzie znaki będą), która ma wielkość (strlen(szA) + strlen(szB) + 1) ale wielkość szA widziane przez malloc to(wpisaliśmy np. kot) będzie wynosić 3+1(nazwijmy to pola pamięci tej tablicy).
Chodzi o to, że malloc nie stworzy tablicy(zaalokuje pamięci wielkości) [2MAX_LENGTH]
Jak usuwam to +1 to program się wciąż kompiluje a powinno nastąpić chyba przepełnienie pamięci no bo brakuje miejsca na znak końca(tak rozumiem to NULL?)
Jeżeli pamięć alokowana jest wielkości [2
MAX_LENGTH] to po kiego używać malloca przecież taką tablicę mogę sam stworzyć(tak rozwiązałem ten problem wcześniej).

PS. czytałem o mallocu na necie ale nie jestem pewien powyższego.

pozdr

0

Trochę się pogubiłem w tej Twojej wypowiedzi, ale spróbuję odpowiedzieć :p
Skompilować się zawsze skompiluje, nawet jak dasz tam malloc(1). Uruchomić się też uruchomi i być może nawet (O ZGROZO!) się nie wysypie. Wysypie się dopiero jak będziesz pisał po nieswojej pamięci, ale nie jest pewne że blok pamięci zaraz za tym zaalokowanym przez malloc nie jest przydzielony Twojej aplikacji. Jeżeli jest to coś ponadpisujesz, i zaczną się cuda nie widy. Jeżeli nie jest to dopiero wtedy się wysypie.

Załóżmy, że w szA siedzi string "kot", a w szB "_bury". Wtedy strlen(szA) zwróci 3, a strlen(szB) 5 - ilość znaków, bez kończącego NULL'a. Z tego wynika, że ten malloc zaalokuje 9 * sizeof(char), czyli dokładnie tyle ile potrzeba(nie mniej, nie więcej)

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