• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Помогите найти ошибку

  • Автор темы Guest
  • Дата начала
G

Guest

Помогите пожалуйста найти ошибку в моей программе.Это универсальная программа тестирования.Вроде все должно работать но почему-то не работает.Вот код программы:[codebox]//универсальная программа тестирования
#include "stdio.h"
#include "conio.h"
#include "string.h"

void main (int arg,char*argv[])
{
char fname[40]; //имя файла текста
FILE*f; //файл текста

int VsegoVopr=0; //количество вопросов теста
int PravOtv=0; //кол-во правх отв.

//для текущего вопроса
int nOtv; //кол-во альтернативных ответов
int Prav; //номер правильного ответа
int Otv; //номер отв выбранного пользователем

int p;

char st[80]; //строка файла теста

int i; //счетчик циклов

//- if (!argc)
{
puts("\nNe zadan fail voprosov testa");
puts("komandnaia stroka: test Imafaila testa\n");
return;
}
strcpy(fname,argv[1]); //имя файла из командной строки
//Открыть файл в режиме чтения® текста (t)
if ((f=fopen(fname,"rt"))==NULL)
{
printf("Owibka otkritia faila %s",fname);
getch();
return;
}

//- clrscr();
puts("\nSe4as vam budet predlojen.");
puts("K kajdomu voprosu daetsia neskoliko \
variantov otveta.");
puts("Vi doljni vvesti nomer pravilinogo otveta.");
puts("i najati klavishu <Enter>\n");


printf("dlia na4ala testirovaniia najmite klavishu <Enter>");
getch();
//- textbackground(BLUE);
//- clrscr();


while (!feof(f))
{
VsegoVopr++;
fgets(st,80,f); //читаем из файла вопрос
printf("\n%s\n",st); //вопрос на экран


fscanf(f,"%i %i",&nOtv,Prav); //кол-во вариантов ответа
//и номер правильного ответа
fgets(st,80,f); //дочитать конец предыдущей строки

//читаем и выводим альтернативные ответы
for (i=1;i<=nOtv;i++)
{
fgets(st,80,f);
printf("%i. %s",i ,st);
}
printf("\nVash vibor->");
scanf("%i",&Otv);
if (Otv == Prav)
PravOtv ++;
}

//обработка рез-та тестирования
//вычислим процент правильных ответов
p = 100*PravOtv/VsegoVopr;
printf("\nVasha ocenka - ");
if (p==100)
puts("Krasav4ik!!!");
if (p>=80 && p<=99)
puts("Tak sebe!!");
if (p>=60 && p<=79)
puts("Slaba4ok!");
if (p<60)
puts("LUZER!!!\n");


puts("\nDlia zaversheniia najmite klavishu <Enter>");
getch();
}


[/codebox]

Вот она же но немного подредактирована.Все равно не выходит.
Код:
//универсальная программа тестирования
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "iostream.h"


void main (int argc,char*argv[])
{
char qqq[40];  //имя файла текста
FILE*f;		  //файл текста

int VsegoVopr=0; //количество вопросов теста
int PravOtv=0;	//кол-во правельных отв.

//для текущего вопроса
int nOtv;		 //кол-во альтернативных ответов
int Prav;		 //номер правильного ответа
int Otv;			//номер отв. выбранного пользователем

int p;

char st[80];	  //строка файла теста

int i;				//счетчик циклов

if (!argc)
{
puts("\nNe zadan fail voprosov testa");
puts("komandnaia stroka: test Imafaila testa\n");
return;
}
strcpy(qqq,argv[1]);	//имя файла из командной строки
//Открыть файл в режиме чтения(r) текста (t)
if ((f=fopen("qqq","rt"))==NULL)
{
printf("Owibka otkritia faila %s",qqq);
getch();
return;
}

puts("\nSe4as vam budet predlojen.");
puts("K kajdomu voprosu daetsia neskoliko \
variantov otveta.");
puts("Vi doljni vvesti nomer pravilinogo otveta.");
puts("i najati klavishu <Enter>\n");


printf("dlia na4ala testirovaniia najmite klavishu <Enter>");
getch();


while (!feof(f))
{
VsegoVopr++;
fgets(st,80,f);				//читаем из файла вопрос
printf("\n%s\n",st);		//вопрос на экран


fscanf(f,"%i %i",&nOtv,Prav);		//кол-во вариантов ответа 
//и номер правильного ответа
fgets(st,80,f);				//дочитать конец предыдущей строки

//читаем и выводим альтернативные ответы
for (i=1;i<=nOtv;i++)
{
fgets(st,80,f);
printf("%i. %s",i ,st);
}
printf("\nVash vibor->");
scanf("%i",&Otv);
if (Otv == Prav)
PravOtv ++;
}

//обработка рез-та тестирования
//вычислим процент правильных ответов
p = 100*PravOtv/VsegoVopr;
printf("\nVasha ocenka - ");
if (p==100) 
puts("Otli4no!!!");
if (p>=80 && p<=99)
puts("horowo!!");
if (p>=60 && p<=79)
puts("Udovletvoritelino!");
if (p<60)
puts("PLOHO!!!\n");


puts("\nDlia zaversheniia najmite klavishu <Enter>");
getch();
}
 
E

European

Описывайте, что конкретно не работает. Иначе поиск ошибки слишком трудоемок
 
G

Guest

При компилировании выдает ошибку:Ошибка приложения,мол память не может быть read и т.д.Думал что она не находит текстовый файл но вроде он есть( файл qqq находится в той же директории что и exe-шник)и все должно работать.Вот ее же код но еще немного отредактированный:
Код:
//универсальная программа тестирования
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "iostream.h"


void main (int argc,char*argv[])
{
char qqq[40];  //имя файла текста
FILE*f;		  //файл текста

int VsegoVopr=0; //количество вопросов теста
int PravOtv=0;	//кол-во правельных отв.

//для текущего вопроса
int nOtv;		 //кол-во альтернативных ответов
int Prav;		 //номер правильного ответа
int Otv;			//номер отв. выбранного пользователем

int p;

char st[80];	  //строка файла теста

int i;				//счетчик циклов

if (!argc)
{
puts("\nNe zadan fail voprosov testa");
puts("komandnaia stroka: test Imafaila testa\n");
return;
}
strcpy(qqq,argv[1]);	//имя файла из командной строки
//Открыть файл в режиме чтения(r) текста (t)
if ((f=fopen(qqq,"r+"))==NULL)
{
printf("Owibka otkritia faila %s",qqq);
getch();
return;
}

puts("\nSe4as vam budet predlojen.");
puts("K kajdomu voprosu daetsia neskoliko \
variantov otveta.");
puts("Vi doljni vvesti nomer pravilinogo otveta.");
puts("i najati klavishu <Enter>\n");


printf("dlia na4ala testirovaniia najmite klavishu <Enter>");
getch();


while (!feof(f))
{
VsegoVopr++;
fgets(st,80,f);				//читаем из файла вопрос
printf("\n%s\n",st);		//вопрос на экран


fscanf(f,"%i %i",&nOtv,&Prav);		//кол-во вариантов ответа 
//и номер правильного ответа
fgets(st,80,f);				//дочитать конец предыдущей строки

//читаем и выводим альтернативные ответы
for (i=1;i<=nOtv;i++)
{
fgets(st,80,f);
printf("%i. %s",i ,st);
}
printf("\nVash vibor->");
scanf("%i",&Otv);
if (Otv == Prav)
PravOtv ++;
}

//обработка рез-та тестирования
//вычислим процент правильных ответов
p = 100*PravOtv/VsegoVopr;
printf("\nVasha ocenka - ");
if (p==100) 
puts("Otli4no!!!");
if (p>=80 && p<=99)
puts("horowo!!");
if (p>=60 && p<=79)
puts("Udovletvoritelino!");
if (p<60)
puts("PLOHO!!!\n");


puts("\nDlia zaversheniia najmite klavishu <Enter>");
getch();
}
 
E

European

1 - Запускаете отладку и находите в какой строке ошибка.
2 - Долго думаете почему так произошло.
3 - Если поняли, мои поздравления.
4 - Если не поняли, показываете где ошибка и почему, на ваш взгляд, она произошла

P.S. Вероятнее всего, вы читаете из файла больше чем в нем есть. Проверяйте результат каждого вызова fgets на NULL
 
G

Guest

Я очистил функцию main и убрал условие:
Код:
	if (!argc)
{
puts("\nNe zadan fail voprosov testa");
puts("komandnaia stroka: test Imafaila testa\n");
return;
}
strcpy(qqq,argv[1]);	//имя файла из командной строки
Не понял почему,но программа работает.Теперь осталось сделать интерфейс.Мне посоветовали перегнать ее в билдер,мол там легче.Но по моему так будет сложнее.Вопрос:Можно код из С++ переделать под билдер?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!