0

我正在为一个学校项目用 c 语言制作一个测验程序。我将问题和答案存储在一个文本文件中。文本文件包含 1 个问题,然后是 4 个选择和一个正确答案(每个都在一个新行中)等等。文件处理的代码是

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<process.h>
void main()
{
int tnum=2,mnum;
printf("Enter a file name to load the quiz from or enter dhruv.txt to load the default file\n");
printf("(For type of file and arrangement of data in it, refer to the documentation\n");
printf("WARNING: An improper quiz file may result in malfunctioning of the program.\n");
char quizfile[100];
scanf("%s",quizfile);
FILE *dj;
dj = fopen(quizfile,"r");
int test = 1;
while(dj == NULL)
{
    printf("Requested file does not exist.Please enter a valid name\n");
    scanf("%s",quizfile);
    dj = fopen(quizfile,"r");
    test++;
    if(test == 5)
    {
    exit(0);
    }
}
char line[500];
char ques[20][500],ansa[20][500],ansb[20][500],ansc[20][500],ansd[20][500],anse[20][500];
int start = 1,quesval=1,ans1=1,ans2=1,ans3=1,ans4=1,ans5=1;
while(fgets(line,sizeof line,dj) != NULL)
{
    if((start%6) == 1)
    {
        strcpy(ques[quesval],line);
        quesval++;
    }
    if((start%6) == 2)
    {
        strcpy(ansa[ans1],line);
        ans1++;
    }
    if((start%6) == 3)
    {
        strcpy(ansb[ans2],line);
        ans2++;
    }
    if((start%6) == 4)
    {
        strcpy(ansc[ans3],line);
        ans3++;
    }

    if((start%6) == 0)
    {
        strcpy(anse[ans5],line);
        ans5++;
    }

    if((start%6) == 5)
    {
        strcpy(ansd[ans4],line);
        ans4++;
    }

    start++;

}
fclose(dj);
printf("Quiz file successfully loaded\n");
printf("/t/t WELCOME TO THE QUIZ\n\n");
printf("Every team must select one of the four correct answers to the asked questions to gain points\n");
printf("Wrong answer will not be penalized\n");
for(int k =1;k<quesval;k++)
{
    int myvar;
    myvar = k%tnum;
    if(myvar == 0)
    {
        myvar = tnum;
    }
    printf("Question for TEAM %d\n\n",myvar);
    printf("%s \n A.%s B.%s C.%s D.%s\n",ques[k],ansa[k],ansb[k],ansc[k],ansd[k]);
}
getch();
}

问题是

        if((start%6) == 0)
    {
        strcpy(anse[ans5],line);
        ans5++;
    }

如果我使用它,程序会显示文件不存在,但是一旦我将其注释掉,程序就可以正常工作。我不知道错误是什么。请帮忙

编辑:我的文本文件看起来像:

Who is the owner
dhruv
jain
kalio
polika
dhruv
who is his friend
sarika
katrina
jen
aarushi
aarushi
where is he
home
office
college
toilet
office
where will he go
home
office
college
toilet
home

编辑 我在 Windows 7 中使用 DOSBOX 使用 Turbo c++。脚本在上面更新

4

2 回答 2

1

没有看到你的输入文件很难说,但我怀疑你的数组声明是倒退的。例如,您有:

 char ques[500][20];

这声明了一个包含 500 个元素的数组,其中每个元素最多可以包含 20 个字符。你可能想要:

 char ques[20][500];

这声明了一个包含 20 个元素的数组,其中每个元素最多可包含 500 个字符。

如果您的输入文件包含超过 20 个字符的行,那么您当前的代码可能会覆盖您的数组。

于 2012-10-15T18:02:47.657 回答
0

这里有几个问题,但你的直接问题是:

strcpy(anse[ans5],line);

(以及所有其他类似的 strcpy 调用。)

您正在将行复制到从 anse[1][0] 开始的数组。如果 line 包含超过 20 个字符,它将覆盖 anse 末尾的内存。例如,如果行包含 25 个字符,您将把它放在 anse[1][0] 到 anse[1][24] 中。不幸的是 anse[1][24] 不存在,因为 anse 只有 20 个字符长。如果任何问题超过 20 个字符,您将破坏内存并可能导致崩溃。让我猜猜:问题 5 超过 19 个字符,对吧?

简而言之,您在声明中混合了行和列。我认为您希望允许 20 个问题,每个问题 500 个字符,但实际上您允许 500 个问题,每个问题 20 个字符。

下一个问题:在 C 中,数组是从零开始的,而不是从一开始的。例如,ques 中的第一个字符串是 ques[0],而不是 ques[1]。

为了简化这一点,将二维数组视为由行和列组成的表。例如,声明一个名为 foo 的 3x4 数组:

char foo[3][4];

把它想象成这样:

   0 1 2 3
0  . . . .
1  . . . .
2  . . . .

我拥有的是一个由三个字符串组成的数组,每个字符串长 4 个字符。我数组中的第一个字符串位于 foo[0]。第一个字符串的第一个字符位于 foo[0][0]。第二个字符在 foo[0][1],第三个字符串的第二个字符是 foo[2][1],以此类推。

要解决此问题,您的声明应如下所示:

char ques[20][500],ansa[20][500],ansb[20][500],ansc[20][500],ansd[20][500],anse[20][500];
int start = 1,quesval=0,ans1=0,ans2=0,ans3=0,ans4=0,ans5=0;

当你让它工作时,你应该问自己为什么要测试 start 的值六次,每次通过循环时它只改变一次。这里有一个更好的解决方案。考虑一个像这样的三维数组:

char answers[20][500][5];

这给了你 20 个问题,每个问题有 5 个答案。

于 2012-10-15T18:43:06.437 回答