Dzienniczek, naruszenie ochrony pamięci

0

Witam!
Mam prośbę dt. programu, który jest swojego rodzaju dzienniczkiem studenckim. Po podaniu imienia nazwiska i oceny program zwraca informacje odnośnie naruszenia ochrony pamięci. Mógłby ktoś zajrzeć w kod i napisać w czym może leżeć problem?

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

typedef struct {
	unsigned char nazwisko[30], imie[30], oceny[60][4];
	int liczba_ocen;
}Student;

void normalize(char tekst[30]){
	int i;
	toupper(tekst[0]);
	for(i=1; i<=strlen(tekst); i++)
	tolower(tekst[i]);
}

int porownaj_studentow(Student a, Student b){
	if(strcmp(a.nazwisko, b.nazwisko))
		return strcmp(a.imie, b.imie);
	else
		return strcmp(a.nazwisko, b.nazwisko);
}

int main(){
	Student grupa[30];
	char im[30],naz[30],oc[4];
	int liczba_stud = 0, i;

	while(!feof(stdin)){
		scanf("%s %s %s", im, naz, oc);
		normalize(im); normalize (naz);
printf("%s %s \n", im, naz);

		for(i=0; i<=liczba_stud; i++){
			if(!(strcmp(grupa[i].nazwisko,naz)  && (strcmp(grupa[i].imie, im)))){
				strcpy(grupa[i].oceny[grupa[i].liczba_ocen],oc);
				grupa[i].liczba_ocen++;
			}
				else {
					strcpy(grupa[i].nazwisko,naz);
					strcpy(grupa[i].imie,im);
					strcpy(grupa[i].oceny[grupa[i].liczba_ocen],oc);
					grupa[i].liczba_ocen++;
					liczba_stud++;
					}
		}
	}


/*qsort(grupa, liczba_stud, sizeof(Student),porownaj_studentow);*/

for(i=0;i<liczba_stud;i++) {
	printf("\n %s %s:", grupa[i].nazwisko,grupa[i].imie);
	int suma, k;
	for(k=0;k<grupa[i].liczba_ocen;k++){
/*		switch (grupa[i].ocena[k]) {
			case "-5","5-": suma += 4.75; break;
			case "+5","5+": suma += 5; break;
			case "-4","4-": suma += 3.75; break;
			case "+4","5+": suma += 4.25; break;
			case "-3","3-": suma += 2.75; break;
			case "+3","3+": suma += 3.25; break;
			case "-2","2-": suma += 2; break;
			case "+2","2+": suma += 2.25; break;
			case "0": suma += 0; break;

	} */
}
}
}
return 0;



0

Uruchom pod debugerem i klikaj. Nikt tego za ciebie nie zrobi.

1

Nie wiem, czy to rozwiąże problem, ale:

 
for(i=0; i<=liczba_stud; i++)

Powinno być

 
for(i=0; i<liczba_stud; i++)

Podobnie:

 
for(i=1; i<=strlen(tekst); i++)

zamień na:

 
for(i=1; i<strlen(tekst); i++)
3

Kilka błędów znalezionych na szybko:

  • funkcja normalize() nic nie robi
  • funkcja porownaj_studentow() ma w pierwszym if zły warunek
  • scanf nie ogranicza długości znaków, ale ma mały bufor na ocenę (pierwsza możliwość wywałki)
  • w main / for / if jest zły warunek (druga możliwość wywałki - czytanie niezainicjowanych danych)
  • w main / for modyfikujesz zmienną wyznaczającą koniec pętli (liczba_stud) - nieładnie, lepiej użyć do {} while
  • w main / for nie przerywasz pętli po dodaniu studenta, dodanie powinno być poza pętlą

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