Sortowanie tablicy struktur - problem ze wskaźnikiem char*

0

Witam. Mam do napisania program, który sortuje tablicę studentów wg ocen. W poniższym kodzie źródłowym wskaźniki char* są czymś, czego ominąć nie mogę.

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

struct student {
	int ocena;
	char* imie;
	char* nazwisko;
};

void sortuj(struct student s[], int n);
int main(){
	int i;
	int n = 3;
	struct student s[n];
	for( i = 0; i < n; i++){
		printf("Podaj ocene: \n");
		scanf("%d", &s[i].ocena);
		printf("Podaj imie: \n");
		scanf("%s",&s[i].imie);
		printf("Podaj nazwisko: \n");
		scanf("%s",&s[i].nazwisko);
	}
	sortuj(s, n);
	for( i = 0; i < n; i++){
		printf("%d |", s[i].ocena);
		printf("%s |", *s[i].imie);
	}
	return 0;
}
void sortuj(struct student s[], int n){
	int i, j, tmp;
	for( i = 0; i < n; i++){
		for( j = 0; j < n; j++){
			if(s[j].ocena > s[j+1].ocena){
				tmp = s[j].ocena;
				s[j].ocena = s[j+1].ocena;
				s[j+1].ocena = tmp;
			}
		}
	}
}

Problem jest taki, że o ile same oceny mi sortuje i wyświetla, to już z imionami i nazwiskami jest problem, program się krzaczy, wyświetla naruszenie ochrony pamięci.

2

Używasz niezainicjalizowanych wskaźników. Alokuj pamięć lub korzystaj z tablicy charów.

0
unknown napisał(a):

Używasz niezainicjalizowanych wskaźników. Alokuj pamięć lub korzystaj z tablicy charów.

Tylko jakbym miał je zainicjalizować lub też w jaki sposób zaalokować pamięć na coś takiego ?

2

malloc. Serio, dowolny kurs/książka o C o tym powie...

0

Np. z użyciem tablicy charów

struct student {
    int ocena;
    char imie[20];
    char nazwisko[20];
};

btw. Używaj fgets zamiast scanf

0

Olej wskaźniki, tutaj to nie jest najważniejsze.

Wersja poprawiona (został jeden z trzech błędów):
http://ideone.com/8rAWwS

  • niezaalokowane imię i nazwisko - poprawione
  • zły zakres w pętli j - poprawione
  • sortowanie tylko oceny - do poprawki

Potem na deser możesz jeszcze doczytać jak uniknąć przepełnienia:
https://stackoverflow.com/questions/1621394/how-to-prevent-scanf-causing-a-buffer-overflow-in-c

0
vpiotr napisał(a):

Olej wskaźniki, tutaj to nie jest najważniejsze.

Wersja poprawiona (został jeden z trzech błędów):
http://ideone.com/8rAWwS

  • niezaalokowane imię i nazwisko - poprawione
  • zły zakres w pętli j - poprawione
  • sortowanie tylko oceny - do poprawki

Właśnie, jak to sortowanie złączyć, żeby łapało ocenę i osobę do niej przypisaną ?

2
Marek Piszczaniuk napisał(a):

Właśnie, jak to sortowanie złączyć, żeby łapało ocenę i osobę do niej przypisaną ?

Zdziwisz się co znalazłem pod hasłem "c sort array of structures":
https://stackoverflow.com/questions/15958773/sort-array-by-struct-in-c

0
vpiotr napisał(a):
Marek Piszczaniuk napisał(a):

Właśnie, jak to sortowanie złączyć, żeby łapało ocenę i osobę do niej przypisaną ?

Zdziwisz się co znalazłem pod hasłem "c sort array of structures":
https://stackoverflow.com/questions/15958773/sort-array-by-struct-in-c

Dzięki wielkie

0
kq napisał(a):

malloc. Serio, dowolny kurs/książka o C o tym powie...

No ok, malloc ,tyle że nie wiem jak by to miało w tym przypadku wyglądać.W main dać coś stylem struct student st.imie = (char*)malloc(sizeof(char)) ? Jakoś za bardzo w tych wskaźnikach się nie orientuję.

0

Tak zaalokujesz miejsce na 1 znak. Skieruj się ku jakiemuś kursowi.

0
kq napisał(a):

Tak zaalokujesz miejsce na 1 znak. Skieruj się ku jakiemuś kursowi.

No właśnie, miejsce na jeden znak. No to jak zaalokować miejsca na pole struktury? Wersja z tablicami jest łatwiejsza, ale problem wskaźników też mi jest potrzebny, by później mieć z tym mniej zagwostek.

0

Znalazłem coś takiego https://stackoverflow.com/questions/14768230/malloc-for-struct-and-pointer-in-c , ale nie jestem pewien czy ma to głębszy sens w moim przypadku

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