Указатели, динамическое выделение памяти, работа с файлами. - 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.