Crash programu - szukanie palindromów. https://github.com/boloslaw/palindrom.git

1

Witam serdecznie,

Napisałem kod, który ma za zadanie szukać palindromów w pliku txt i przepisywać wyszukane palindromy w kolejności alfabetycznej do innego, nowo utworzonego pliku. No i mam 2 problemy.

  1. Do palindromów doczepiane są jakieś śmieci.
  2. Program wyrzuca crash, ale nawet po mimo tego wpisuje palindromy (ze śmieciami) do pliku.

W załączeniu daje link do guthub-a.
https://github.com/boloslaw/palindrom.git

Może ktoś mógłbym rzucić okiem i znaleźć błąd.
Z góry wielkie dzięki.

Pozdrawiam

1
  1. Użyj debugera, nikt tego nie zrobi za ciebie
  2. Doklejanie śmieci = brakuje ci gdzieś nullbyte na końcu stringa
  3. crash -> odpal pod debugerem i zobaczysz gdzie się wysypało

a wrzucenie na githuba jakichś konfigów i skompilowanych plików to niezły wyczyn :D

0

Dobra crash zniknął, ale problem ze śmieciami pozostał. Tyle tylko, że śmieci pojawiają się jak moja zmienna char ma rozmiar parzysty to wtedy drukuje jeden znak śmieć na koncu. Przy nie parzystym rozmiarze wszystko jest ok.

0

To sugeruje jakieś off-by-one w którejś pętli, tzn przechodzisz sobie o 1 indeks za daleko. Czemu nie użyjesz debuggera, serio? Gryzie? Bije? o_O

0

Wiem w której pętli, w którym momencie to się dzieje, ale nie wiem tak na prawdę dlaczego. Co do debuger-a to przyznam, że nie wiem za bardzo jak to się je.

2

@boloslaw to się dowiedz bo w prawdziwej pracy pewnie 50% czasu nad kodem spędzisz właśnie z debugerem :P To jest takie cudo które pozwala między innymi wykonywać program instrukcja po instrukcji i pokazuje zawartość wszystkich zmiennych, w efekcie możesz sobie dokładnie prześledzić gdzie i czemu dzieje sie coś dziwnego.
Wstawiasz sobie breakpoint w kodzie w miejscu gdzie wiesz że coś jest nie tak, uruchamiasz i debugger się tam zatrzyma.

0

No i pobawiłem się trochę debugerem i okazuje się, że wciska mi do mojego char'a symbol o kodzie ascii \002. Tylko nie wiem czmu i od czego to zależy.

0

No ale "sam" go nie wciska. Musi być jakaś instrukcja w kodzie która to robi, innej możliwości nie ma :D

0

Na prawdę jesteś aż tak leniwy że musisz pisać "we"/"wy" zamiast "wejście"/"wyjście"?

0

Tak jestem leniwy, ale walczę z tym :) Rozumiem, że niektórzy mogą mieć problem z rozszyfrowaniem skrótów.
Program działa. Dlaczego wcześniej nie działał, tego nie wiem.

1

Nie sądzisz że bufor jest ciut za mały? ;)

char *bufor = (char*) malloc(sizeof(char)); 
0
Krwawy Kaczor napisał(a):

Nie sądzisz że bufor jest ciut za mały? ;)

char *bufor = (char*) malloc(sizeof(char)); 

A może jakaś mała podpowiedź jak mógłbym "powiększyć" bufor??

0

Użyj magicznego działania zwanego czasem mnożeniem.

0
mwl4 napisał(a):

Użyj magicznego działania zwanego czasem mnożeniem.

Dzięki. To akurat wiem. Problem tylko, że nie wiem przez co to pomnożyć. Generalnie zmienną bufor alokuje na samym początku programu. fscanf'em pobieram z pliku do tej zmiennej jeden wyraz. Długość wyrazów jest zmienna, więc nie specjalnie wiem przez co miałbym to przemnożyć.

0

Jeśli nie ma ograniczenia na długość słowa to musisz się bawić w czytanie z pliku za pomocą fread() paczek o określonej długości (rozmiar bufora) i ewentualne sklejanie sąsiednich paczek. Ale jeśli to ma działać dla zwykłych tekstów to możesz sobie zrobić pewnie bufor na 100 znaków i styknie.

0

Dzięki za poradę.
Mam jeszcze takie pytanka co do zwalniania pamięci. Może mi się w końcu to wyjaśni. Chodzi mi o to kiedy mam zwolnić dynamicznie alokowaną pamięć (free).

  1. Zmienną bufor mam alokowaną dynamicznie na początku programu, więc zwalniam ją na końcu programu, np. zaraz przed returnem. Dodatkowo wskaźnik = NULL. Czy dobrze myślę?
  2. Jeżeli np. alokuję dynamicznie zmienną w pętli, to kiedy muszę ją zwolnić?? Na koniec programu, za pętlą, czy bez znaczenia??
0
  1. nie, zwalniasz pamiec gdy wiesz, ze dany obiekt/zmienna juz nie bedzie potrzebna. Najlepiej alokowac i zwalniac w obrebie jednej funkcji (dzieki temu nie zapomnisz o zwolnieniu pamieci i nie bedzie wyciekow)
  2. czytaj powyzej ;) jezeli alokujesz w petli to pozniej w jakies petli (albo nawet tej samej, nie ma znaczenia) musisz ja zwolnic.

Ilosc malloc oraz free musi(*) byc taka sama

nie zawsze, ale na poczatku zapamietaj ta zasade

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