Dzienniczek, naruszenie ochrony pamięci

Odpowiedz Nowy wątek
2015-01-28 14:24
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;
edytowany 1x, ostatnio: must, 2015-01-28 14:24

Pozostało 580 znaków

2015-01-28 14:27
0

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


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-01-28 14:41
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++)

Pozostało 580 znaków

2015-01-28 15:13
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ą

Szacuje się, że w Polsce brakuje 50 tys. programistów

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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