C dostęp do struktury za pomocą wskaźników

0

Witam
Muszę zrobić zadanie w którym trzeba użyć struktury dla 4 członków rodziny.Struktura ma być uzupełniona z klawiatury a dostęp do tej struktury ma się odbywać wyłącznie za pomocą wskaźników. I tutaj pojawia się mój problem ponieważ nie do końca wiem jak użyć tych wskaźników. Póki co wykombinowałem coś takiego ale ostateczne wypisanie poprzez funkcje druk zjada litery z imion/nazwiska. Proszę o pomoc jak poprawnie zrealizować to zadanie.

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

typedef struct osoba
{
char imie[16];
char nazwisko[16];
int wiek;
}osoba;

void funkcja (osoba *posoba,int i ,char c[],char s[])
{

strcpy(posoba->imie,c);

strcpy(posoba->nazwisko,s);

posoba->wiek=i;
printf("%s,%s,%i\n\n",posoba->imie,posoba->nazwisko,posoba->wiek);
};

void druk(osoba *os,osoba *os1,osoba *os2,osoba *os3)
{
    printf("%s,%s,%i\n",os->imie,os->nazwisko,os->wiek);
    printf("%s,%s,%i\n",os1->imie,os1->nazwisko,os1->wiek);
    printf("%s,%s,%i\n",os2->imie,os2->nazwisko,os2->wiek);
    printf("%s,%s,%i\n",os3->imie,os3->nazwisko,os3->wiek);


};
int main(void)
{

int i;
char c[16],s[16];
osoba tata,dziecko,dziecko1,mama;
osoba *ptata,*pmama,*pdziecko,*pdziecko1;
ptata=&tata;
pmama=&mama;
pdziecko1=&dziecko1;
pdziecko=&dziecko;


printf("Imie taty:");
scanf("%s",&c);
printf("Nazwistko taty:");
scanf("%s",&s);
printf("Wiek taty:");
scanf("%i",&i);
funkcja(&ptata,i,c,s);

printf("Imie mamy:");
scanf("%s",&c);
printf("Nazwistko mamy:");
scanf("%s",&s);
printf("Wiek mamy:");
scanf("%i",&i);
funkcja(&pmama,i,c,s);

printf("Imie dziecka1:");
scanf("%s",&c);
printf("Nazwistko dziecka1:");
scanf("%s",&s);
printf("Wiek dziecka1:");
scanf("%i",&i);
funkcja(&pdziecko,i,c,s);

printf("Imie dziecka2:");
scanf("%s",&c);
printf("Nazwistko dziecka2:");
scanf("%s",&s);
printf("Wiek dziecka2:");
scanf("%i",&i);
funkcja(&pdziecko1,i,c,s);


druk(&ptata,&pmama,&pdziecko,&pdziecko1);

 return EXIT_SUCCESS;
}


1

W sumie to przy kompilacji masz dużo warnów. Do tego masz ograniczenie znakowe do 15 co jest słabe.
Napisałem Ci coś takiego na jakiejś tam liście. Nie wiem czy nigdzie się niw wychrzania ale chyba działa. Tutaj nie masz ograniczenia znakowego na inpucie (chyba).

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

#define MAX 10

const char *type[4] = {"Mammy","Daddy","Doughter","Son"};
typedef enum {MOM = 0,DAD,DAU,SON,EOE} person_type;

struct osoba{
	char *imie;
	char *nazwisko;
	int wiek;
	person_type t;
};

int check(char *str){
    char chk = str[strlen(str)-1];
    if(strlen(str) < MAX-1){
        return 1;
    }else if(chk == '\n' || chk == '\r'){
        return 1;
    }else{
        return 0;   //success
    }
}

void my_read(char **data){
    int sign_ptr = MAX;                             //first initialize to MAX
    char *ptr = *data = (char *)malloc(MAX);        //first malloc
    while(fgets(ptr,MAX,stdin) != NULL){            //read data
        if(check(ptr))break;                        //check - end?
        sign_ptr+=MAX-1;                            //add to sign ptr MAX-1 (number of read bytes)
        *data = (char *)realloc(*data,sign_ptr);    //realloc memory for string
        ptr = *data+sign_ptr-MAX;                   //set actual ptr to position (actual array_length - MAX)
    }
}

struct osoba *read_person(person_type t){
	struct osoba *my;
	int c;
	if(t < EOE){
		my = (struct osoba *)malloc(sizeof(struct osoba));
		printf("Name %s: ",type[t]);
		my_read(&my->imie);
		printf("Surname %s: ",type[t]);
		my_read(&my->nazwisko);
		printf("Age %s: ",type[t]);
		scanf("%d",&(my->wiek));
		while ((c = getchar()) != '\n' && c != EOF);
		my->t = t;
		return my;
	}
	return NULL;	//error
}

struct list{
	struct osoba *person;
	struct list *next;
};

void list_push_back(struct list **lst,struct osoba *person){
	struct list *tmp = *lst;
	if(tmp!=NULL){						//tmp not null
		while(tmp->next != NULL)tmp = tmp->next;	
		tmp->next = (struct list *)malloc(sizeof(struct list));
		tmp = tmp->next;
	}else{
		tmp = *lst = (struct list *)malloc(sizeof(struct list));
	}
	tmp->next = NULL;
	tmp->person = person;					//add osoba
}

void list_delete_all(struct list **lst){
	struct list *tmp = *lst;
	struct list *tmp2;
	while(tmp != NULL){					//when tmp is not null
		free(tmp->person->imie);		//free imie
		free(tmp->person->nazwisko);	//free nazwisko
		free(tmp->person);				//free osoba
		tmp2 = tmp;						//save actual head ptr
		tmp=tmp->next;					//next element
		free(tmp2);						//free actual head
	}
}

void list_print_persons(struct list **lst){
	struct list *tmp = *lst;
	while(tmp != NULL){
		printf("%s\n\tname: %s\tsurname: %s\tAge: %d\n\n",type[tmp->person->t],
			tmp->person->imie,tmp->person->nazwisko,tmp->person->wiek);
		tmp = tmp->next;
	}
}

int main(void){
	struct list *moja_lista = NULL;
	int i;
	for(i=0;i<EOE;i++){
		list_push_back(&moja_lista,read_person(i));
	}
	list_print_persons(&moja_lista);
	list_delete_all(&moja_lista); 

 return EXIT_SUCCESS;
}

Popatrz, może coś skorzystasz.

0

Wielkie dzięki za pomoc, na pewno coś skorzystam jednak ten kod jest zdecydowanie na wyższym poziomie niż ja aktualnie jestem.

W moim kodzie zrobiłem jedną poprawkę przy wywołaniu funkcji

funkcja(ptata,i,c,s);

i nie ma żadnych ostrzeżeń przy kompilacji i program działa poprawnie. I tu mam pytanko czy po tej poprawce można uznać że dostęp do struktury z teoretycznego punktu widzenia odbywa się tylko i wyłącznie przez wskaźniki ?

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