Wczytywanie do tablicy dynamicznej

0

Witam.
W dużym skrócie chcę napisać program który porównuje dwa ciągi znaków (niezbyt istotne w jaki sposób), jednak by nie ograniczać za bardzo, chciałem by użytkownik mógł wklepać oba teksty sam (w kodzie oznaczone jako bas i pat), jednak po poprawnym (jak mi się wydaje) wczytaniu pierwszego ciągu znaków i po wpisaniu drugiego, po wduszeniu "entera" program się wysypuje mimo że drugi ciąg wczytuję podobnie jak pierwszy i mam poważne problemy ze znalezieniem przyczyny.
Będę wdzięczny za wszelkie sugestie :)
Kod:

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

int main(int argc, char *argv[])
{
	char *bas,*pat,d;
	int i,sizeBas,sizePat; 
    
    printf("Wpisz tekst bazowy, zakoncz go przyciskiem \"Enter\":\n");
	i=0;
	bas=(char*)malloc(sizeof(char));
	while((d=getchar())!=10){
		realloc(bas,(i+1)*(sizeof(char)));
		bas[i++]=d;
	}
	sizeBas=i;
	
	printf("Bas: %s\n",bas);	////////////////////////////////////////////////////////////////////
	
    printf("Wpisz tekst wzorca, zakoncz go przyciskiem \"Enter\":\n");
	i=0;
	bas=(char*)malloc(sizeof(char));
	while((d=getchar())!=10){
		realloc(pat,(i+1)*(sizeof(char)));
		pat[i++]=d;
	}
	sizePat=i;    
    
	printf("Pat: %s\n",pat);	/////////////////////////////////////////////////////////////
	    
    free(pat);
    free(bas);
    system("PAUSE");	
    return 0;
}
2
  1. Łamiesz zasadę DRY - stwórz funkcję char *readLine() aczkolwiek należy pamiętać że nie jest to bezpiecznie bo łatwo zapomnieć o zwolnieniu.
  2. Jak wymienisz miejscami realloc z przypisaniem to masz o jedną operację mniej
  3. Zapominasz że jest to napis zaś jako napis musi się kończyć znakiem '\0'
  4. Doczytaj jak działa realloc - źle go używasz
  5. Nie potrzebujesz sizeof(char) - zawsze będzie to 1
  6. Nie używaj magicznych liczb, przecież \n jest znane i rozumiane
  7. W sumie powinno wyjść coś w rodzaju:
char *readLine()
  {
   size_t i=0;
   char ch,*buf;
   for(buf=malloc(1);(ch=getchar())!='\n';buf=realloc(buf,i)) buf[i++]=ch;
   buf[i]=0;
   return buf;
  }

z tym że warto się zastanowić na przydzielenie fragmentami po np 64 bajty zaś na końcu realloc na właściwy rozmiar.

0

Dziękuję za rady, postaram się wszystko wziąć do serca, wszystko pięknie działa (zgodnie z radą zrobiłem alokację co 32 i na koniec do konkretnego rozmiaru), dziękuję serdecznie. :D
Jednak się buntuje powyżej pewnej długości tekstu (powyżej 56 znaków), ale to już jakoś sobie poradzę :P

1

Jeżeli się buntuje to robisz coś źle, pokaż kod.

0

Już zauważyłem błąd - źle realokowałem pamięć, już wszystko w pełni dobrze.
Jeszcze raz dziękuję serdecznie :D

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