Указатели, динамическое выделение памяти, работа с файлами. - C (СИ)
Формулировка задачи:
Здрасте всем! При запуске программа выдает ошибку, связанную, как я понял, с неправильным выделением памяти. Программа на Си. Вот код (сильно не ругайтесь, ибо я новичок в этом деле):
#include <conio.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int mass[255]; void Massiv(int*mass) { int p,m,k; mass=(int*)malloc(256*sizeof(int)); FILE*Dan; Dan=fopen("Dannue","r+b"); fseek(Dan,p*sizeof(char),SEEK_SET); for(k=0;k<256;k++) { fscanf(Dan,"%d",mass[k]); printf("%d",mass[k]); } puts("enter new element:\n"); scanf("%d",&m); fseek(Dan,0,SEEK_END); fprintf(Dan,"%d",m); int d; puts("enter the number of delete element:\n"); scanf("%d",&d); delete((int*)mass[d]); fclose(Dan); int c=0; int scetchik = 0; while (mass[k]!= '\0') { scetchik++; } for(k=1;k<256;k++) { c+=mass[k]; } c = c/scetchik; printf("\nSumma=%d",c); int y[256]; for(k=1;k<256;k++) { if(mass[k]<5) {y[k]=(1-5*mass[k])-6; } if(mass[k]>=5&&mass[k]<=30) {y[k]=(mass[k]-5)/mass[k]; } else {y[k]=10*mass[k]/3; } printf("\n\ny%d=%0.3lf",k+1,y[k]); } getch(); } void main(void) {char login[128],strPass[128]; int i,j, symbol; printf ("enter login:\n"); scanf("%s",&login); printf ("password:\n"); scanf("&s",&strPass); for(i=0;i<128;i++) {symbol=getch(); if(symbol==13) {break;} strPass[i]=symbol; printf("*"); } FILE*Spis; Spis=fopen("Spisok","r"); strrev(strPass); char*Pass; char str[256],pas[256]; int p; for( i=0;i<256;i=i+2) { fscanf(Spis,"%s",str[i]); char*strPtr=&str[i]; if(login!=strPtr) { puts("error!!!"); break; } else { fscanf(Spis,"%s",pas[i+1]); char*pasPtr=&pas[i+1]; if(Pass!=pasPtr) { puts("error!!!"); break; } else p=(i/2)+1; Massiv(mass); } } fclose(Spis); getch(); }
Решение задачи: «Указатели, динамическое выделение памяти, работа с файлами.»
textual
Листинг программы
char*Pass; char str[256],pas[256]; int p; for( i=0;i<256;i=i+2) { fscanf(Spis,"%s",str[i]); char*strPtr=&str[i]; if(login!=strPtr) { puts("error!!!"); break; } else { fscanf(Spis,"%s",pas[i+1]); char*pasPtr=&pas[i+1]; if(Pass!=pasPtr)
Объяснение кода листинга программы
- Объявлены три переменные:
char*Pass;
char str[256],pas[256];
int p;
- Задается цикл, который выполняется 256 раз (нечетные индексы).
- Внутри цикла происходит чтение строки из файла
Spis
с помощью функцииfscanf()
.- Строка сохраняется в массив
str
с помощью оператора%s
и указателяstr[i]
. - Затем происходит проверка на то, что указатель
strPtr
указывает на только что прочитанную строку. Если это не так, то выводится сообщение об ошибке и цикл прерывается.
- Строка сохраняется в массив
- Если цикл не был прерван, то происходит чтение следующей строки из файла
Spis
с помощью функцииfscanf()
.- Строка сохраняется в массив
pas
с помощью оператора%s
и указателяpas[i+1]
. - Затем происходит проверка на то, что указатель
pasPtr
указывает на только что прочитанную строку. Если это не так, то цикл прерывается.
- Строка сохраняется в массив
- После завершения цикла, программа продолжает работу с переменными
Pass
,str
иpas
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д