Zapis i odczyt listy do/ z pliku binarnego

0

Witam

Czy ktoś mógłby poprawić funkcję zapisującą (save) i odczytującą (load). Nie radze sobie z zapisem plików. Niby dane są zapisywane do pliku, jednak po ich odczytaniu program wyświetla krzaczki zamiast poprawnych wartości

Oto kod programu:

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

struct klient{
       char imie[15];
       char nazwisko[15];
       int pesel;
       };

struct ksiazka{
       int rok_wydania;
       char tytul[30];
       char autor[30];
       int dostepnosc;
       int cena_wypoz;
       struct klient klient;
       struct ksiazka *next, *prev;
       };
       
////-----------DODAWACZKA----------------------------------//
struct ksiazka * dodaj_nowy(struct ksiazka *head) 
{
       char tmp[30];
       struct ksiazka *x= NULL;
       x = (struct ksiazka *)malloc(sizeof(struct ksiazka));
       
       struct ksiazka *pomocnicza = NULL;
       pomocnicza = head;
           
       
       
       //--------->POBIERANIE DANYCH O KSIAZCE
       printf("Podaj rok wydania ksiazki: \n");
       scanf("%d", &x->rok_wydania);
       
       printf("Podaj tytul dziela: \n");
       fflush(stdin);
       gets(tmp);
       strcpy(x->tytul, tmp);
       
       printf("Podaj autora dziela: \n");
       fflush(stdin);
       gets(tmp);
       strcpy(x->autor, tmp);
       
       
       printf("Podaj cene wypozyczenia ksiazki/tydzien: \n");
       scanf("%d", &x->cena_wypoz);

       
       x->dostepnosc=1;
       
if(head){
       while(head->next) head=head->next;
             x->prev=head;
             x->next=NULL;
             head->next=x;
             return pomocnicza;}
else {
       x->prev=NULL;
       x->next=NULL;
       return x;
       }
      
}

//--------------UUSUWACZKA----------------------//
struct ksiazka *usun(struct ksiazka *head)
{
      struct ksiazka *x = head;
      printf("Podaj tytul ksiazki do usuniecia: \n");
      char tmp[30];
      fflush(stdin);
      gets(tmp);
      
      while(strcmp(tmp,x->tytul)&&x->next!=NULL) x=x->next; //strcmp porownuje stringi i zwraca 0 jak sa takie same
      
     if(x==NULL) printf("Nie ma takiej ksiazki!!!!\n");
     else if(x->next==NULL && x->prev==NULL){
            head=NULL;
            }
     else if(x->prev==NULL){//element jest glowa
                        head=x->next;
                        x->prev=NULL;
                        x->next->prev=head;
                        }
      else if(x->next==NULL){//element jest ogonem
            x->prev->next=NULL;
           }
      else{//element nie jest ani ogonem ani glowa
           x->next->prev=x->prev;
           x->prev->next=x->next;
           }
           
      free(x);
      
      return head;
}


//-------------------WYPOZYCZACZ-------------------------------//
void wypozycz(struct ksiazka *head)
{ 
     char tmp[30];
     printf("Podaj tytul ksiazki ktora jest do wypozyczenia: \n");
     gets(tmp);
     
     while(strcmp(tmp, head->tytul) && head) head=head->next;
     
     if(head=NULL) printf("Nie ma takiej ksiazki!\n");
     else if(head->dostepnosc == 0 ) printf("Ksiazka nie jest dostepna! \n");
     else{
          printf("Podaj imie klienta: \n");
          scanf("%s", &tmp);
          strcpy(head->klient.imie, tmp);
          
          printf("Podaj nazwisko klienta: \n");
          scanf("%s", &tmp);
          strcpy(head->klient.nazwisko, tmp);
          
          printf("Podaj numer PESEL klienta: \n");
          scanf("%d", head->klient.pesel);
          
          head->dostepnosc=1;         
          }
}

//---------------ODDANIE KSIAZKI-----------//
void zwrot(struct ksiazka *head)
{
     int pesel = 0;
     printf("Podaj numer PESEL osoby, ktora wypozyczyla ksiazke: \n");
     scanf("%d", &pesel);
     char tmp[1]={"\0"};
     while(head->klient.pesel != pesel && head) head=head->next;
     
     if(head==NULL) printf("Osoba o takim PESEL nie wypozyczyla zadnej ksiazki!\n");
     else{
          head->dostepnosc = 1;
          strcpy(head->klient.imie, tmp);
          strcpy(head->klient.nazwisko, tmp);
          head->klient.pesel=0;
          }
}

//---------------KOSZTOW LICZYDLO---------------------------------------//
int koszt_wszystkich(struct ksiazka *head)//liczy koszt calkowity aktualnie niewypozyczonych ksiazek
{
     int suma = 0;
     
     while(head) {
                 suma = suma + head->cena_wypoz;
                 head=head->next;
                 }    
     return suma;
     }
     
int koszt_dostepnych(struct ksiazka *head)
{
     int suma = 0;
     
     while(head){
                 if(head->dostepnosc==1) suma = suma + head->cena_wypoz;
                 head=head->next;
                 }
     return suma;
     }
     
void cena_ksiazek(struct ksiazka *head)
{
     printf("Koszt aktualnie dostepnych ksiazek wynosi: %d\n", koszt_dostepnych(head));
     printf("Koszt wszystkich ksiazek wynosi: %d \n", koszt_wszystkich(head));
     }
     
//---------------SZUKANIE NAJTANSZEJ KSIAZKI-----------------------//


int szukaj_najtanszej(struct ksiazka *head)//znalezienie najnizszej ceny
{
    int najnizsza = head->cena_wypoz;
    
    while(head->next) {
                if(head->next->cena_wypoz < najnizsza) najnizsza = head->next->cena_wypoz;
                head=head->next;
                }
    return najnizsza;     
     }


void pokash_najtansza(struct ksiazka *head)//pokazanie elementu o tej cenie
{
     int cena = szukaj_najtanszej(head);
     while(head && head->cena_wypoz != cena) head=head->next;
     
     if(head->dostepnosc == 1) printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: TAK",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
      else printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: NIE",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
     }

//--------------------WYSZUKANIE KSIAZKI PO TYTULE--------------------------------------//
void szukajka(struct ksiazka *head)
{
     printf("Podaj tytul poszukiwanej ksiazki: \n");
     char tmp[30];
     scanf("%s", &tmp);
     
     while(strcmp(tmp, head->tytul) && head) head=head->next;
     
     if(head==NULL) printf("Nie ma takiej ksiazki!\n");
     else {
          if(head->dostepnosc == 1) printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: TAK",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
      else printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: NIE",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
          }
     }
//--------------WYPISANIE WSZYSTKICH POZYCJI--------------------//
void pokash_sysko(struct ksiazka *head)
{
     while(head){
     if(head->dostepnosc == 1) printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: TAK\n",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
      else printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: NIE\n",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
                         
      head=head->next;
                 }
     }

//----------------------Zapisanie danych do pliku---------------------//
void save(char *nazwa, struct ksiazka *head)
{
     FILE *pliczek = fopen(nazwa,"w+b");
     while(head!=NULL){
                 fwrite(head->tytul,sizeof (char),strlen(head->tytul),pliczek);
                 fwrite(&head,sizeof (struct ksiazka), 1, pliczek);
                 head=head->next;
                 }
     fclose(pliczek);
         
     }
     
//----------------WCZYTANIE DANYCH Z PLIKU--------------------------------//
struct ksiazka *load(char *nazwa, struct ksiazka *head)
{
      FILE *pliczek=fopen(nazwa, "r+b");
   
   if(pliczek==NULL){
                     pliczek=fopen(nazwa,"w+b");
                     }
   struct ksiazka *pierwszy, *nowy, *ostatni;
      pierwszy = head;
    
    
    while (1){
                if(pierwszy==NULL){
                        if((nowy=(struct ksiazka*)malloc(sizeof(struct ksiazka))) == NULL) ;
                        if(1!=fread(nowy, sizeof(struct ksiazka), 1, pliczek)) break;//fread zwraca 1 jesli nie udalo sie 
                        nowy->next=NULL;                                             //odczytac pliku, badz sie skonczyl
                        nowy->prev=NULL;
                        pierwszy=nowy;
                        ostatni = pierwszy;
                               }
                else {
                        if((nowy=(struct ksiazka*)malloc(sizeof(struct ksiazka))) == NULL) ;
                        if(1!=fread(nowy, sizeof(struct ksiazka), 1, pliczek)) break;
                        nowy->next=NULL;
                        nowy->prev=ostatni;
                        ostatni->next=nowy;
                        ostatni=nowy;
                }
        }
        fclose(pliczek);
        pliczek=NULL;
              return pierwszy;
       }
       
/* FUNKCJA MAIN*/

int main(void)
{
    struct ksiazka *head = NULL;
    char nazwa[]={"Bucher.jac"};
    
    head = load(nazwa, head);
    char akcja;
    
    do{
    printf("Podaj liczbe odpowiadajaca interesujacej cie akcji:\n1. Dodaj nowa ksiazke\n2. Usun wybrany tytul\n");
    printf("3. Wypozycz ksiazke\n4. Oddaj ksiazke\n5. Oblicz srednia cene wypozyczenia ksiazek\n");
    printf("6. Wyszukaj ksiazke o najnizszej cenie\n7. Wyszukaj ksiazke wg tytulu\n8. Wypisz informacje o wszystkich tytulach\n");
    printf("9. Zakoncz prace\n");
                fflush(stdin);
                scanf("%c",&akcja);
    switch(akcja)
    {
                 case'1':head = dodaj_nowy(head);
                         break;
                 case'2':head = usun(head);
                         break;
                 case'3':wypozycz(head);
                         break;
                 case'4':zwrot(head);
                         break;
                 case'5':cena_ksiazek(head);
                         break;
                 case'6':pokash_najtansza(head);
                         break;
                 case'7':szukajka(head);
                         break;
                 case'8':pokash_sysko(head);
                         break;
                 case'9':printf("Milego dnia!\n");
                         break;
                 default:printf("Nieznany kod operacji! Sprobuj ponownie:\n");
                 
                 }
                
                }
    while(akcja!='9');
    save(nazwa,head);
    
}
 
0
void save(... struct ksiazka *head)
{
	...
	
	while(...)
	{
		fwrite(head->tytul,sizeof (char),strlen(head->tytul),pliczek); // <--- (1)
		fwrite(&head,...); // <--- (2)
	}

}
  1. po co ta linia, przecież niżej znów zapiszesz tytuł wraz z całą strukturą?
  2. head jest wskaźnikiem, zatem funkcji fwrite podajesz wskaźnik na wskaźnik.
0

poprawiłem błędy tak jak mówisz. Teraz funkcja wygląda tak:

//----------------------Zapisanie danych do pliku---------------------//
void save(char *nazwa, struct ksiazka *head)
{
     FILE *pliczek = fopen(nazwa,"w+b");
     while(head!=NULL){
                 fwrite(head,sizeof (struct ksiazka), 1, pliczek);
                 head=head->next;
                 }
     fclose(pliczek);
         
     } 

ale nadal po odczytaniu krzaczki. Jakieś pomysły?? Może problem leży po stronie odczytu pliku??

Pojawił się kolejny problem funkcja wypozycz również nie działa.

0

W odczycie błędów nie zauważyłem, poza paroma bezsensami.

Tu masz wersję bardziej spójną:

struct ksiazka *load(const char *nazwa)
{
	FILE *f = fopen(nazwa, "r+b");
	if(!f) return NULL;
	
	struct ksiazka *pierwszy = NULL, *nowy, *ostatni = NULL;
	struct ksiazka	tmp;

	while(1 == fread(&tmp, sizeof(struct ksiazka), 1, f))
	{
		nowy = (struct ksiazka*)malloc(sizeof(struct ksiazka));
		*nowy = tmp;
		
		nowy->next = NULL;                                             
		nowy->prev = ostatni;
		
		if(!pierwszy) pierwszy = nowy;
		if(ostatni) ostatni->next = nowy;
		ostatni = nowy;
	}
	
	fclose(f);
	return pierwszy;
}

void wypozycz(struct ksiazka *head)
{ 
	char tmp[30];

	gets(tmp); //<--- (1)

	while(strcmp(tmp, head->tytul) && head) //<--- (2)
		head = head->next; 


	scanf("%s", &tmp);	//<--- (3)
	strcpy(head->klient.imie, tmp);

	...
	scanf("%s", &tmp);	//<--- (3)
	strcpy(head->klient.nazwisko, tmp);

	...
	scanf("%d", head->klient.pesel); //<--- (3)

	...
	head->dostepnosc=1;         //<---(4)

}
  1. użyj bezpieczniejszej wersji - fgets.
  2. zły warunek. Najpierw sprawdź, czy head nie jest nullem, a dopiero później dobieraj się do tytułu.
  3. dziwny brak konsekwencji. Dajesz '&' przed tablicami, ale przy peselu, który jest intem, już nie. Jest to błąd. scanf oczekuje adresu zmiennej, pod który ma wpisać dane ze strumienia.
  4. dostepnosc powinna być zero.
0

Zapis i odczyt działa ednak nie wiem dlaczego nie działa funkcja wypozycz i zwrot. Oto obecny kod mojego programu:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct klient{
       char imie[15];
       char nazwisko[15];
       int pesel;
       };
 
struct ksiazka{
       int rok_wydania;
       char tytul[30];
       char autor[30];
       int dostepnosc;
       int cena_wypoz;
       struct klient klient;
       struct ksiazka *next, *prev;
       };
 
////-----------DODAWACZKA----------------------------------//
struct ksiazka * dodaj_nowy(struct ksiazka *head) 
{
       char tmp[30];
       struct ksiazka *x= NULL;
       x = (struct ksiazka *)malloc(sizeof(struct ksiazka));
 
       struct ksiazka *pomocnicza = NULL;
       pomocnicza = head;
 
 
 
       //--------->POBIERANIE DANYCH O KSIAZCE
       printf("Podaj rok wydania ksiazki: \n");
       scanf("%d", &x->rok_wydania);
 
       printf("Podaj tytul dziela: \n");
       fflush(stdin);
       gets(tmp);
       strcpy(x->tytul, tmp);
 
       printf("Podaj autora dziela: \n");
       fflush(stdin);
       gets(tmp);
       strcpy(x->autor, tmp);
 
 
       printf("Podaj cene wypozyczenia ksiazki/tydzien: \n");
       scanf("%d", &x->cena_wypoz);
 
 
       x->dostepnosc=1;
 
if(head){
       while(head->next) head=head->next;
             x->prev=head;
             x->next=NULL;
             head->next=x;
             return pomocnicza;}
else {
       x->prev=NULL;
       x->next=NULL;
       return x;
       }
 
}
 
//--------------UUSUWACZKA----------------------//
struct ksiazka *usun(struct ksiazka *head)
{
      struct ksiazka *x = head;
      printf("Podaj tytul ksiazki do usuniecia: \n");
      char tmp[30];
      fflush(stdin);
      gets(tmp);
 
      while(strcmp(tmp,x->tytul)&&x->next!=NULL) x=x->next; //strcmp porownuje stringi i zwraca 0 jak sa takie same
 
     if(x==NULL){ printf("Nie ma takiej ksiazki!!!!\n");}
     else if(x->next==NULL && x->prev==NULL){
            head=NULL;
            }
     else if(x->prev==NULL){//element jest glowa
                        head=x->next;
                        x->prev=NULL;
                        x->next->prev=head;
                        }
      else if(x->next==NULL){//element jest ogonem
            x->prev->next=NULL;
           }
      else{//element nie jest ani ogonem ani glowa
           x->next->prev=x->prev;
           x->prev->next=x->next;
           }
 
      free(x);
 
      return head;
}

 
//-------------------WYPOZYCZACZ-------------------------------//
void wypozycz(struct ksiazka *head)
{ 
 char tmp[30];
     
     if(head==NULL){
     printf("Baza jest pusta\n");
     }
     else{
     fflush(stdin);     
     fgets (tmp, 15, stdin);
        while(strcmp(tmp, head->tytul) && head) head=head->next;
 
     if(head=NULL){ printf("Nie ma takiej ksiazki!\n");}
     else if(head->dostepnosc == 0 ) {printf("Ksiazka nie jest dostepna! \n");}
     else{
          printf("Podaj imie klienta: \n");
          scanf("%s", &tmp);
          strcpy(head->klient.imie, tmp);
 
          printf("Podaj nazwisko klienta: \n");
          scanf("%s", &tmp);
          strcpy(head->klient.nazwisko, tmp);
 
          printf("Podaj numer PESEL klienta: \n");
          scanf("%d", &head->klient.pesel);
 
          head->dostepnosc=0;                
          }
     }
     
     
}
 
//---------------ODDANIE KSIAZKI-----------//
void zwrot(struct ksiazka *head)
{
     int pesel = 0;
     printf("Podaj numer PESEL osoby, ktora wypozyczyla ksiazke: \n");
     scanf("%d", &pesel);
     char tmp[1]={"\0"};
     while(head->klient.pesel!= pesel && head) head=head->next;
 
     if(head==NULL) printf("Osoba o takim PESEL nie wypozyczyla zadnej ksiazki!\n");
     else{
          head->dostepnosc = 1;
          strcpy(head->klient.imie, tmp);
          strcpy(head->klient.nazwisko, tmp);
          head->klient.pesel=0;
          }
}
 
//---------------KOSZTOW LICZYDLO---------------------------------------//
int koszt_wszystkich(struct ksiazka *head)//liczy koszt calkowity aktualnie niewypozyczonych ksiazek
{
     int suma = 0;
 
     while(head) {
                 suma = suma + head->cena_wypoz;
                 head=head->next;
                 }    
     return suma;
     }
 
int koszt_dostepnych(struct ksiazka *head)
{
     int suma = 0;
 
     while(head){
                 if(head->dostepnosc==1) suma = suma + head->cena_wypoz;
                 head=head->next;
                 }
     return suma;
     }
 
void cena_ksiazek(struct ksiazka *head)
{
     printf("Koszt aktualnie dostepnych ksiazek wynosi: %d\n", koszt_dostepnych(head));
     printf("Koszt wszystkich ksiazek wynosi: %d \n", koszt_wszystkich(head));
     }
 
//---------------SZUKANIE NAJTANSZEJ KSIAZKI-----------------------//
 
 
int szukaj_najtanszej(struct ksiazka *head)//znalezienie najnizszej ceny
{
    int najnizsza = head->cena_wypoz;
 
    while(head->next) {
                if(head->next->cena_wypoz < najnizsza) najnizsza = head->next->cena_wypoz;
                head=head->next;
                }
    return najnizsza;     
     }
 
 
void pokash_najtansza(struct ksiazka *head)//pokazanie elementu o tej cenie
{
     int cena = szukaj_najtanszej(head);
     while(head && head->cena_wypoz != cena) head=head->next;
 
     if(head->dostepnosc == 1) printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: TAK",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
      else printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: NIE",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
     }
 
//--------------------WYSZUKANIE KSIAZKI PO TYTULE--------------------------------------//
void szukajka(struct ksiazka *head)
{
     printf("Podaj tytul poszukiwanej ksiazki: \n");
     char tmp[30];
     scanf("%s", &tmp);
 
     while(strcmp(tmp, head->tytul) && head) head=head->next;
 
     if(head==NULL) printf("Nie ma takiej ksiazki!\n");
     else {
          if(head->dostepnosc == 1) printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: TAK",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
      else printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: NIE",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
          }
     }
//--------------WYPISANIE WSZYSTKICH POZYCJI--------------------//
void pokash_sysko(struct ksiazka *head)
{
     while(head){
     if(head->dostepnosc == 1) printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: TAK\n",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
      else printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: NIE\n",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
 
      head=head->next;
                 }
     }
 
//----------------------Zapisanie danych do pliku---------------------//
void save(char *nazwa, struct ksiazka *head)
{
     FILE *pliczek = fopen(nazwa,"w+b");
     while(head!=NULL){
                 fwrite(head,sizeof (struct ksiazka), 1, pliczek);
                 head=head->next;
                 }
     fclose(pliczek);
 
     } 
 
//----------------WCZYTANIE DANYCH Z PLIKU--------------------------------//
struct ksiazka *load(const char *nazwa)
{
        FILE *f = fopen(nazwa, "r+b");
        if(!f) return NULL;
 
        struct ksiazka *pierwszy = NULL, *nowy, *ostatni = NULL;
        struct ksiazka        tmp;
 
        while(1 == fread(&tmp, sizeof(struct ksiazka), 1, f))
        {
                nowy = (struct ksiazka*)malloc(sizeof(struct ksiazka));
                *nowy = tmp;
 
                nowy->next = NULL;                                             
                nowy->prev = ostatni;
 
                if(!pierwszy) pierwszy = nowy;
                if(ostatni) ostatni->next = nowy;
                ostatni = nowy;
        }
 
        fclose(f);
        return pierwszy;
}

 
/* FUNKCJA MAIN*/
 
int main(void)
{
    struct ksiazka *head = NULL;
    char nazwa[]={"Bucher.jac"};
 
    head = load(nazwa);
    char akcja;
 
    do{
    printf("Podaj liczbe odpowiadajaca interesujacej cie akcji:\n1. Dodaj nowa ksiazke\n2. Usun wybrany tytul\n");
    printf("3. Wypozycz ksiazke\n4. Oddaj ksiazke\n5. Oblicz srednia cene wypozyczenia ksiazek\n");
    printf("6. Wyszukaj ksiazke o najnizszej cenie\n7. Wyszukaj ksiazke wg tytulu\n8. Wypisz informacje o wszystkich tytulach\n");
    printf("9. Zakoncz prace\n");
                fflush(stdin);
                scanf("%c",&akcja);
    switch(akcja)
    {
                 case'1':head = dodaj_nowy(head);
                         break;
                 case'2':head = usun(head);
                         break;
                 case'3':wypozycz(head);
                         break;
                 case'4':zwrot(head);
                         break;
                 case'5':cena_ksiazek(head);
                         break;
                 case'6':pokash_najtansza(head);
                         break;
                 case'7':szukajka(head);
                         break;
                 case'8':pokash_sysko(head);
                         break;
                 case'9':printf("Milego dnia!\n");
                         break;
                 default:printf("Nieznany kod operacji! Sprobuj ponownie:\n");
 
                 }
 
                }
    while(akcja!='9');
    save(nazwa,head);
 
}
0

Bardzo proszę o pomoc. Program muszę oddać w czwartek na zliczenie.

0

Aha i jeszcze jedno we wszystkich funkcjach po wpisaniu błędnego tytułu zamiast informacji o tym że nie ma takiej książki wywala błąd. Co może być tego powodem???

0

Rzuciłem okiem tylko pod kątem ostatniego pytania bo nie mam kompilatora/debuggera pod ręką:
łaskawie sprawdź co zwraca strcmp(), bo zapewniam cię że nie jest to "true" jak znajdzie i "false" jak nie znajdzie...

0

(...) jednak nie wiem dlaczego nie działa funkcja wypozycz i zwrot.

Jeśli chodzi o wypozycz, to napisałem przecież, co jest nie tak - punkt 2 i 3, popraw te błędy i funkcja powinna działać.

void zwrot(struct ksiazka *head)
{
	...

	char tmp[1] = { "\0" };	

	while(head->klient.pesel != pesel && head) //<--- (1)
		head = head->next;

	...
		strcpy(head->klient.imie, tmp);		//<--- (2)
		strcpy(head->klient.nazwisko, tmp); //<--- (2)
}
  1. to samo, co w funkcji wypozycz - zły warunek. Najpierw sprawdź, czy head nie jest nullem, potem bierz się za pesel.
  2. przerost formy nad treścią. Wystarczy head->klient.imie[0] = '\0';

Co może być tego powodem???

Patrz punkt 1 i 2(wypozycz)

Jeszcze tu masz błąd:

void wypozycz(struct ksiazka *head)
{ 
	...
	
	if(head = NULL) //<--- !!!!
	{ 
		printf("Nie ma takiej ksiazki!\n");
	}

przeoczyłem go... :/

0

Wszystkie funkcje już działają. Co prawda nie w pełni, ponieważ nie wiem jak zapewnić, żeby w przypadku podania błędnego tytułu ( w funkcjach: szukajka, usun,wypozycz) lub błędnego peselu(w funkcji zwrot) program wyświetlił odpowiednio komunikaty: "Brak ksiazki o podanym tytule" i "Osoba o tym peselu nic nie wypozyczyla". Jutro o 17 musze oddać ten program, a do poprawy zostało juz tylko to i kosmetyka.

Oto kod obecnego programu:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct klient{
       char imie[15];
       char nazwisko[15];
       int pesel;
};
 
struct ksiazka{
       int rok_wydania;
       char tytul[30];
       char autor[30];
       int dostepnosc;
       int cena_wypoz;
       struct klient klient;
       struct ksiazka *next, *prev;
};
 
////-----------DODAWACZKA----------------------------------//
struct ksiazka * dodaj_nowy(struct ksiazka *head){
       
       char tmp[30];
       struct ksiazka *x= NULL;
       x = (struct ksiazka *)malloc(sizeof(struct ksiazka));
 
       struct ksiazka *pomocnicza = NULL;
       pomocnicza = head;
 
 
 
       //--------->POBIERANIE DANYCH O KSIAZCE
       printf("Podaj rok wydania ksiazki: \n");
       scanf("%d", &x->rok_wydania);
 
       printf("Podaj tytul dziela: \n");
       fflush(stdin);
       gets(tmp);
       strcpy(x->tytul, tmp);
 
       printf("Podaj autora dziela: \n");
       fflush(stdin);
       gets(tmp);
       strcpy(x->autor, tmp);
 
 
       printf("Podaj cene wypozyczenia ksiazki/tydzien: \n");
       scanf("%d", &x->cena_wypoz);
 
 
       x->dostepnosc=1;
 
     if(head){
             while(head->next) head=head->next;
             x->prev=head;
             x->next=NULL;
             head->next=x;
             return pomocnicza;
     }
    
     else {
          x->prev=NULL;
          x->next=NULL;
          return x;
     }
 
}

//---------------KOSZTOW LICZYDLO---------------------------------------//
int koszt_wszystkich(struct ksiazka *head)//liczy koszt calkowity aktualnie niewypozyczonych ksiazek
{
     int suma=0,i=0, srednia=0;
 
     while(head!=NULL){
                 suma = suma + head->cena_wypoz;
                 head=head->next;
                 i=i+1;
     }    
     srednia=suma/i;
     return srednia;
     }
 
int koszt_dostepnych(struct ksiazka *head){
    int suma=0,srednia=0,i=0;

     
     while(head!=NULL){
         if(head->dostepnosc==1){
                 suma = suma + head->cena_wypoz;
                 i=i+1;
         }
     head=head->next;
     }    
     srednia=suma/i;
     return srednia;
     }
 
void cena_ksiazek(struct ksiazka *head){
   if(head==NULL){
   printf("Baza danych jest pusta\n\n");
   }
   
   else{
     printf("Sredni koszt aktualnie dostepnych ksiazek wynosi:%d \n", koszt_dostepnych(head));
     printf("Sredni koszt wszystkich ksiazek wynosi:%d \n", koszt_wszystkich(head));
   }
}

//---------------SZUKANIE NAJTANSZEJ KSIAZKI-----------------------//
 
 
int szukaj_najtanszej(struct ksiazka *head){
    
    
 
      
 int najnizsza = head->cena_wypoz;
    
    while(head->next!=0){
                if(head->next->cena_wypoz < najnizsza) najnizsza = head->next->cena_wypoz;
                head=head->next;
    }
    
    return najnizsza; 
   

}
 
 
void pokash_najtansza(struct ksiazka *head){
     if(head==NULL){
 printf("Baza danych jest pusta\n");
 }
 
 else{
     int cena = szukaj_najtanszej(head);
     while(head && head->cena_wypoz != cena) head=head->next;
 
     if(head->dostepnosc==1) printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: TAK",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
     else printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: NIE",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
     }
                         
}


//--------------WYPISANIE WSZYSTKICH POZYCJI--------------------//
void pokash_sysko(struct ksiazka *head){ 
  if(head==NULL){
  printf("Baza danych jest pusta\n");
  }
  else{
     while(head!=0){
      if(head->dostepnosc == 1) printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: TAK\n",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
      else printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: NIE\n\nDANE WYPORZYCZAJACEGO\nImie: %s\nNazwisko: %s\nPesel: %d\n",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz, head->klient.imie,  head->klient.nazwisko,  head->klient.pesel);
 
      head=head->next;
      }
    }
}
//----------------------Zapisanie danych do pliku---------------------//
void save(char *nazwa, struct ksiazka *head)
{
     FILE *pliczek = fopen(nazwa,"w+b");
     while(head!=NULL){
                 fwrite(head,sizeof (struct ksiazka), 1, pliczek);
                 head=head->next;
                 }
     fclose(pliczek);
 
     } 
 
//----------------WCZYTANIE DANYCH Z PLIKU--------------------------------//
struct ksiazka *load(const char *nazwa)
{
        FILE *f = fopen(nazwa, "r+b");
        if(!f) return NULL;
 
        struct ksiazka *pierwszy = NULL, *nowy, *ostatni = NULL;
        struct ksiazka        tmp;
 
        while(1 == fread(&tmp, sizeof(struct ksiazka), 1, f))
        {
                nowy = (struct ksiazka*)malloc(sizeof(struct ksiazka));
                *nowy = tmp;
 
                nowy->next = NULL;                                             
                nowy->prev = ostatni;
 
                if(!pierwszy) pierwszy = nowy;
                if(ostatni) ostatni->next = nowy;
                ostatni = nowy;
        }
 
        fclose(f);
        return pierwszy;
}

//--------------UUSUWACZKA----------------------//
struct ksiazka *usun(struct ksiazka *head){
      if (head==NULL) printf("Baza danych jest pusta\n");
       else{   
             struct ksiazka *x = head;
      printf("Podaj tytul ksiazki do usuniecia: \n");
      char tmp[30];
      fflush(stdin);
      gets(tmp);
 
      while(strcmp(tmp,x->tytul)!=0) x=x->next; //strcmp porownuje stringi i zwraca 0 jak sa takie same
     
     if(x->next==NULL && x->prev==NULL){
            head=NULL;
            }
     else if(x->prev==NULL){//element jest glowa
                        head=x->next;
                        x->prev=NULL;
                        }
      else if(x->next==NULL){//element jest ogonem
            x->prev->next=NULL;
           }
      else{//element nie jest ani ogonem ani glowa
           x->next->prev=x->prev;
           x->prev->next=x->next;
           }
 
      free(x);
 
      return head;
      }

    
}
 
 
//-------------------WYPOZYCZACZ-------------------------------//
void wypozycz(struct ksiazka *head){
 
     if(head==NULL){
     printf("Baza jest pusta\n");
     }
     else{
     char tmp[30];
     printf("Podaj tytul ksiazki do wypozyczenia\n");
     fflush(stdin);     
     gets(tmp);
      while(strcmp(tmp, head->tytul)!= 0 && head!=NULL ){ 
       head=head->next;}
       if (head->dostepnosc==0) printf("Ksiazka juz zostala wypozyczona\n");
       else{
             printf("Podaj imie klienta: \n");
             scanf("%s", &tmp);
             strcpy(head->klient.imie, tmp);
             printf("Podaj nazwisko klienta: \n");
             scanf("%s", &tmp);
             strcpy(head->klient.nazwisko, tmp);
             printf("Podaj numer PESEL klienta: \n");
             scanf("%d", &head->klient.pesel);
 
             head->dostepnosc=0;}
     }

}

//---------------ODDANIE KSIAZKI-----------//
void zwrot(struct ksiazka *head)
{     
     int pesel = 0;
     printf("Podaj numer PESEL osoby, ktora wypozyczyla ksiazke: \n");
     scanf("%d", &pesel);

     while(head->klient.pesel != pesel) head=head->next;
     
          head->dostepnosc = 1;
          head->klient.imie[0] = '\0';
          head->klient.nazwisko[0] = '\0';
          head->klient.pesel=0;

}
 
//--------------------WYSZUKANIE KSIAZKI PO TYTULE--------------------------------------//
void szukajka(struct ksiazka *head)
{
    if (head==NULL) printf("Baza danych jest pusta\n");
    else{
     printf("Podaj tytul poszukiwanej ksiazki: \n");
     char tmp[30];
     fflush(stdin);     
     gets(tmp);
 
     while(strcmp(tmp, head->tytul) !=0) head=head->next;
 
      if(head->dostepnosc == 1) printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: TAK\n",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
      else printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: NIE\n\nDANE WYPORZYCZAJACEGO\nImie: %s\nNazwisko: %s\nPesel: %d\n",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz, head->klient.imie,  head->klient.nazwisko,  head->klient.pesel);
    }     

}
 

 
/* FUNKCJA MAIN*/
 
int main(void)
{
    struct ksiazka *head = NULL;
    char nazwa[]={"Bucher.jac"};
 
    head = load(nazwa);
    char akcja;
 
    do{
    printf("Podaj liczbe odpowiadajaca interesujacej cie akcji:\n1. Dodaj nowa ksiazke\n2. Usun wybrany tytul\n");
    printf("3. Wypozycz ksiazke\n4. Oddaj ksiazke\n5. Oblicz srednia cene wypozyczenia ksiazek\n");
    printf("6. Wyszukaj ksiazke o najnizszej cenie\n7. Wyszukaj ksiazke wg tytulu\n8. Wypisz informacje o wszystkich tytulach\n");
    printf("9. Zakoncz prace\n");
                fflush(stdin);
                scanf("%c",&akcja);
    switch(akcja)
    {
                 case'1':head = dodaj_nowy(head);
                         break;
                 case'2':head = usun(head);
                         break;
                 case'3':wypozycz(head);
                         break;
                 case'4':zwrot(head);
                         break;
                 case'5':cena_ksiazek(head);
                         break;
                 case'6':pokash_najtansza(head);
                         break;
                 case'7':szukajka(head);
                         break;
                 case'8':pokash_sysko(head);
                         break;
                 case'9':printf("Milego dnia!\n");
                         break;
                 default:printf("Nieznany kod operacji! Sprobuj ponownie:\n");
 
                 }
 
                }
    while(akcja!='9');
    save(nazwa,head);
 
}
 
0
while(strcmp(tmp, x->tytul) != 0) x = x->next; //strcmp porownuje stringi i zwraca 0 jak sa takie same

A kiedy pętla ta się zatrzyma (poza przypadkiem, gdy znajdzie szukany tytuł)?

void wypozycz(struct ksiazka *head)
{
	...
	while(strcmp(tmp, head->tytul) != 0 && head != NULL)
	...

Ech, przyjrzyj się warunkowi pętli w funkcji pokash_najtansza, bo tam jest on poprawny. Analogiczne warunki stwórz we wszystkich pętlach przeszukujących listę.

0

Poprawiłem te warunki o których mówisz, jednak dalej nie wiem jak spowodować żeby program wypisał komunikat w przypadku gdy tytułu nie będzie na liście. Teraz w przypadku podania błędnego tytułu wywala mi błąd aplikacji.

0

Zastanów się trochę. Jeśli nie będzie danego tytułu, pętla 'zwróci' NULLa (o ile dobrze poprawiłeś pętle). Więc wystarczy dać odpowiedni warunek z komunikatem i przerwać wykonywanie funkcji.

0

Do tego już doszedłem ale nie wiem jak to zrobić, żeby działało.

0

Dumałem i dumałem aż wydumałem. Zamieszczam cały kod działającego programu. Jeśli ktoś by go chciał sprawdzić go pod względem występowania jakichś nonsensów to byłbym wdzięczny. Jednocześnie dziękuję wszystkim, którzy mi pomogli. Dobrze, że zmuszacie do myślenia, a nie podajecie wszystkiego na talerzu. Dzięki temu zaczynam zupełnie inaczej patrzeć na kod programów, a co najważniejsze zaczynam go rozumieć, a nawet myśleć kodem.

Oto kod programu:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct klient{
       char imie[15];
       char nazwisko[15];
       int pesel;
};
 
struct ksiazka{
       int rok_wydania;
       char tytul[30];
       char autor[30];
       int dostepnosc;
       int cena_wypoz;
       struct klient klient;
       struct ksiazka *next, *prev;
};
 
//-----------DODAJ ELEMENT----------------------------------//
struct ksiazka * dodaj_nowy(struct ksiazka *head){
       
       char tmp[30];
       struct ksiazka *x= NULL;
       x = (struct ksiazka *)malloc(sizeof(struct ksiazka));
 
       struct ksiazka *pomocnicza = NULL;
       pomocnicza = head;
 
 
 
//---------POBIERANIE DANYCH O KSIAZCE-----------------------//
       printf("Podaj rok wydania ksiazki: \n");
       scanf("%d", &x->rok_wydania);
 
       printf("Podaj tytul dziela: \n");
       fflush(stdin);
       gets(tmp);
       strcpy(x->tytul, tmp);
 
       printf("Podaj autora dziela: \n");
       fflush(stdin);
       gets(tmp);
       strcpy(x->autor, tmp);
 
 
       printf("Podaj cene wypozyczenia ksiazki/tydzien: \n");
       scanf("%d", &x->cena_wypoz);
 
 
       x->dostepnosc=1;
 
     if(head){
             while(head->next) head=head->next;
             x->prev=head;
             x->next=NULL;
             head->next=x;
             return pomocnicza;
     }
    
     else {
          x->prev=NULL;
          x->next=NULL;
          return x;
     } 
}



//---------------OBLICZANIE ŚREDNIEGO KOSZTU----------------------------------//

//------WSZYSTKICH KSIĄŻEK-----------------//
int koszt_wszystkich(struct ksiazka *head){

     int suma=0,i=0, srednia=0;
 
     while(head!=NULL){
                 suma = suma + head->cena_wypoz;
                 head=head->next;
                 i=i+1;
     }
     srednia=suma/i;
     return srednia;
}
//-----DOSTĘPNYCH KSIĄŻEK-----------------//
int koszt_dostepnych(struct ksiazka *head){
    int suma=0,srednia=0,i=0;

     
     while(head!=NULL){
         if(head->dostepnosc==1){
                 suma = suma + head->cena_wypoz;
                 i=i+1;
         }
     head=head->next;
     }    
     srednia=suma/i;
     return srednia;
}
 
void cena_ksiazek(struct ksiazka *head){
   if(head==NULL){
   printf("Baza danych jest pusta\n\n");
   }
   
   else{
     printf("Sredni koszt aktualnie dostepnych ksiazek wynosi:%d \n", koszt_dostepnych(head));
     printf("Sredni koszt wszystkich ksiazek wynosi:%d \n", koszt_wszystkich(head));
   }
}



//---------SZUKAJ NAJTAŃSZEJ KSIĄŻKI--------------//
int szukaj_najtanszej(struct ksiazka *head){
    if(head==NULL) printf("Baza danych jest pusta");
    
    else{
       int najnizsza = head->cena_wypoz;
    
       while(head->next!=0){
                if(head->next->cena_wypoz < najnizsza) najnizsza = head->next->cena_wypoz;
                head=head->next;
       }
    
    return najnizsza; 
    }
}
 
 
void pokaz_najtansza(struct ksiazka *head){
     if(head==NULL){
       printf("Baza danych jest pusta\n");
     }
 
     else{
       int cena = szukaj_najtanszej(head);
       while(head->cena_wypoz != cena ) head=head->next;
 
         if(head->dostepnosc==1) printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: TAK",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
         else printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: NIE",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
     }                         
}


//--------WYPISZ WSZYSTKIE POZYCJE-------//
void pokaz_wszystko(struct ksiazka *head){ 
  if(head==NULL){
  printf("Baza danych jest pusta\n");
  }
  else{
     while(head!=0){
      if(head->dostepnosc == 1) printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: TAK\n",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
      else printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: NIE\n\nDANE WYPORZYCZAJACEGO\nImie: %s\nNazwisko: %s\nPesel: %d\n",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz, head->klient.imie,  head->klient.nazwisko,  head->klient.pesel);
 
      head=head->next;
     }
  }
}



//----------ZAPIS DANYCH DO PLIKU-----------//
void save(char *nazwa, struct ksiazka *head)
{
     FILE *pliczek = fopen(nazwa,"w+b");
     while(head!=NULL){
        fwrite(head,sizeof (struct ksiazka), 1, pliczek);
        head=head->next;
     }
     fclose(pliczek);
} 

 
//----------------WCZYTANIE DANYCH Z PLIKU--------------------------------//
struct ksiazka *zapisz(const char *nazwa){
        FILE *f = fopen(nazwa, "r+b");
        if(!f) return NULL;
 
        struct ksiazka *pierwszy = NULL, *nowy, *ostatni = NULL;
        struct ksiazka        tmp;
 
        while(1 == fread(&tmp, sizeof(struct ksiazka), 1, f)){
                nowy = (struct ksiazka*)malloc(sizeof(struct ksiazka));
                *nowy = tmp;
 
                nowy->next = NULL;                                             
                nowy->prev = ostatni;
 
                if(!pierwszy) pierwszy = nowy;
                if(ostatni) ostatni->next = nowy;
                ostatni = nowy;
        }
 
        fclose(f);
        return pierwszy;
}



//-----------USUWANIE ELEMENTU-----------//
struct ksiazka *usun(struct ksiazka *head){
       if (head==NULL) printf("Baza danych jest pusta\n");
       else{   
             struct ksiazka *x = head;
             printf("Podaj tytul ksiazki do usuniecia: \n");
             char tmp[30];
             fflush(stdin);
             gets(tmp);
 
             while(strcmp(tmp,x->tytul)!=0 && head != NULL)
             if(head->next==NULL){
             printf("Nie ma takiej ksiazki\n");
             return NULL;
             }
             else x=x->next; 
     
            if(x->next==NULL && x->prev==NULL)head=NULL;
            
            else if(x->prev==NULL){     /*Element jest głową */
                        head=x->next;
                        x->prev=NULL;
            }
            else if(x->next==NULL){     /*Element jest ogonem */
            x->prev->next=NULL;
            }
            else{                       /*Element nie jest głową ani ogonem */ 
              x->next->prev=x->prev;
              x->prev->next=x->next;
            }
 
       free(x);
 
       return head;
       }
}
 
 
//--------WYPOŻYCZENIE KSIĄŻKI-------//
void wypozycz(struct ksiazka *head){
 
     if(head==NULL){
     printf("Baza jest pusta\n");
     }
     else{
     char tmp[30];
     
     printf("Podaj tytul ksiazki do wypozyczenia\n");
     fflush(stdin);     
     gets(tmp);
     while(strcmp(tmp, head->tytul)!= 0 && head != NULL)
      if(head->next==NULL){
        printf("Nie ma takiej ksiazki\n");
        return ;  
      }
     else head=head->next;
      
       if (head->dostepnosc==0) printf("Ksiazka juz zostala wypozyczona\n");
       else{
             printf("Podaj imie klienta: \n");
             scanf("%s", &tmp);
             strcpy(head->klient.imie, tmp);
             printf("Podaj nazwisko klienta: \n");
             scanf("%s", &tmp);
             strcpy(head->klient.nazwisko, tmp);
             printf("Podaj numer PESEL klienta: \n");
             scanf("%d", &head->klient.pesel);
 
             head->dostepnosc=0;}
       }
}


//-------ODDANIE KSIĄŻKI--------//
void zwrot(struct ksiazka *head){     
     
   if (head==NULL) printf("Baza danych jest pusta\n");

   else{
     int pesel = 0;
     printf("Podaj numer PESEL osoby, ktora wypozyczyla ksiazke: \n");
     scanf("%d", &pesel);

     while(head->klient.pesel != pesel && head != NULL) 
     if(head->next==NULL){
     printf("Osoba o takim peselu nic nie wypożyczyła\n");
     return;
     }
     else head=head->next;
     
          head->dostepnosc = 1;
          head->klient.imie[0] = '\0';
          head->klient.nazwisko[0] = '\0';
          head->klient.pesel=0;
   }
}
 
//-------WYSZUKANIE KSIĄŻKI PO TYTULE--------//
void szukaj_tyt(struct ksiazka *head){
    if (head==NULL) printf("Baza danych jest pusta\n");
    else{
     printf("Podaj tytul poszukiwanej ksiazki: \n");
     char tmp[30];
     fflush(stdin);     
     gets(tmp);
 
     while (strcmp(tmp, head->tytul)!=0 && head != NULL)
     if(head->next==NULL){
     printf("Nie ma takiej ksiazki\n");
     return;
     }
     else head=head->next;
     
      if(head->dostepnosc == 1) printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: TAK\n",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz);
      else printf("Autor: %s\nTytul: %s\nRok wydania: %d\nCena wypozyczenia: %d\nDostepnosc: NIE\n\nDANE WYPORZYCZAJACEGO\nImie: %s\nNazwisko: %s\nPesel: %d\n",
                         head->autor,head->tytul,head->rok_wydania, head->cena_wypoz, head->klient.imie,  head->klient.nazwisko,  head->klient.pesel);
    }  
}
 

 
//------FUNKCJA MAIN----------//
 
int main(void){
    struct ksiazka *head = NULL;
    char nazwa[]={"Bucher.jac"};
 
    head = zapisz(nazwa);
    char akcja;
 
    do{
    printf("Podaj liczbe odpowiadajaca interesujacej cie akcji:\n");
    printf("1. Dodaj nowa ksiazke\n");
    printf("2. Usun wybrany tytul\n");
    printf("3. Wypozycz ksiazke\n");
    printf("4. Oddaj ksiazke\n");
    printf("5. Oblicz srednia cene wypozyczenia ksiazek\n");
    printf("6. Wyszukaj ksiazke o najnizszej cenie\n");
    printf("7. Wyszukaj ksiazke wg tytulu\n");
    printf("8. Wypisz informacje o wszystkich tytulach\n");
    printf("9. Zakoncz prace\n");
    
    fflush(stdin);
    scanf("%c",&akcja);
    
        switch(akcja){
                 case'1':head = dodaj_nowy(head);
                         break;
                 case'2':head = usun(head);
                         break;
                 case'3':wypozycz(head);
                         break;
                 case'4':zwrot(head);
                         break;
                 case'5':cena_ksiazek(head);
                         break;
                 case'6':pokaz_najtansza(head);
                         break;
                 case'7':szukaj_tyt(head);
                         break;
                 case'8':pokaz_wszystko(head);
                         break;
                 case'9':printf("Milego dnia!\n");
                         break;
                 default:printf("Nieznany kod operacji! Sprobuj ponownie:\n");
         }
 
    }
    while(akcja!='9');
    save(nazwa,head); 
}
0
fflush(stdin);
gets(tmp);

Łuff, rzadko się zdarza, żeby na dwie linijki rzucać dwa tak wielkie byki. :P

fflush(stdin)
  • niezdefiniowane zachowanie, fflush ma tylko ze strumieniami wyjścia działać.
gets()
  • ...po prostu nigdy nie używaj gets() - jeśli masz bufor 50-znakowy a przez gets() podasz 100 znaków, to albo masz segfault albo wyjeżdżasz za tablicę i wesoło nadpisujesz sobie inne zmienne tymi nadmiarowymi wartościami. scanf("%s", buf) zrobi zresztą to samo (i jak widzę, też masz to w kodzie :P) - ale scanfa możesz poprawić: scanf("%50s", buf), a gets() już nie. Jeśli już, to użyj fgets(). ;)

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