Zadanie maturalne - zawieszanie się programu

0

Robię zdanie maturalne z 2012.
podpunkty a i b poszły mi bez problemu, zrobione w chwilę. w podpunkcie c) chciałem pobrać całą linię i później sprawdzać po kolei cyfry czy tworzą ciąg rosnący..

Nie działa mi pobieranie całej linii.. a dokładnie ten fragment :

fgets(cyfry,100,plik);

próbując zamknąć plik, tj.

 fclose(plik);

również jest ten sam błąd.

Kompiluje się, ale wyskakuje błąd przy uruchomieniu.. Co jest nie tak? prosiłbym o pomoc, nie wiem czy coś przeoczyłem czy pomyliłem.

Tutaj cały program :

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

FILE *plik;
int liczba=0;
int i=0;
int a=0;
int tab[1000];
int max=0;
int min=81;
int max_liczba=0;
int min_liczba=0;
char cyfry[100];


int rozdziel(int number)
{
        int wynik=0;
        while(number!=0)
        {
        wynik+=number%10;
        number=number/10;
        }
        
        return wynik;
}


int main(int argc, char *argv[]) 
{
        plik=fopen("C:\\cyfry.txt","r");
        
        for(i=1;i<=1000;i++)
                {
                fscanf(plik,"%d",&liczba); //a
                if(liczba%2==0) a++;
                
                tab[i]=rozdziel(liczba);  //b
                if(tab[i]>max) 
                        {
                        max=tab[i];
                        max_liczba=liczba;
                        }
                
                if(tab[i]<min) 
                        {
                        min=tab[i];
                        min_liczba=liczba;
                        }
                        
                fgets(cyfry,100,plik);
                }
                
                
        printf("%d \n",a);
        printf("%d \n",max_liczba);
        printf("%d \n",min_liczba);
        system("PAUSE");
        return 0;
}
0

Jeżeli chcesz czytać plik jeszcze raz to zastanów się nad fseek.
Podaj linka do treści zadania.

0

user image

Błąd to : Process excited with return value 3221225477
Podobny błąd wyskakuje mi gdy się zapomni np. & przed zmienną przy wczytywaniu do niej wartości. Ale to u mnie wygląda wszędzie ok.

1

fscanf wyjmuje dane z bufora, więc fgets pobierze inne dane. Lepiej pobierz je fgetsem od razu, a potem użyj sscanf do odczytania wartości liczbowej. Tak będzie też łatwiej policzyć sumę cyfr liczby.

int tab[1000];
for(i=1;i<=1000;i++){
//...
	tab[i]=rozdziel(liczba);

W ostatniej iteracji masz UB - wychodzisz poza tablicę.

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