0

次の形式の while question.txt から読み取ろうとしています。

Question\n
Difficulty:Cost:Prize\n
Correct Answer\n
Answer 1\n
.
.
.
Answer i\n
\n

以下は、questions.txt から読み取り、それを一時ノードに保存して、リンクされたリストに追加する関数です。

pQuestionType loadQuestions(pQuestionType pFirst)
{
    pQuestionType pTemp = malloc(sizeof(pQuestionType));
    FILE* pFile;
    string sFilename, sTemp;
    char cDump;
    int nTemp, n=0;
    gotoxy(0,0);
    system("cls");
    printf("Enter file name: ");
    gets(sFilename);
    pFile = fopen(sFilename, "rt");
    while(!feof(pFile))
    {
        printf("Iteration \n");
        fgets(sTemp, 255, pFile);
        strcpy(pTemp->sQuestion, sTemp);
        pTemp->sQuestion[strlen(sTemp)-1] = '\0';
        printf("Add question success\n");

        fscanf(pFile, "%d%c", &nTemp, &cDump);
        pTemp->nDifficulty = nTemp;
        printf("Add difficulty success\n");

        fscanf(pFile, "%d%c", &nTemp, &cDump);
        pTemp->nCost = nTemp;
        printf("Add cost success\n");

        fscanf(pFile, "%d%c", &nTemp, &cDump);
        pTemp->nWinnings = nTemp;
        printf("Add winnings success\n");

        fgets(sTemp, 255, pFile);
        strcpy(pTemp->sCorrect, sTemp);
        pTemp->sCorrect[strlen(sTemp)-1] = '\0';
        strcpy(pTemp->sAnswers[0], sTemp);
        pTemp->sAnswers[0][strlen(sTemp)-1] = '\0';
        printf("Add answer success\n");

        for(n=1; n<10; n++)
        {
            fgets(sTemp, 255, pFile);
            if(*sTemp == '\n')break;
            strcpy(pTemp->sAnswers[n], sTemp);
            pTemp->sAnswers[n][strlen(sTemp)-1] = '\0'; 
        }
        printf("Add choices success\n");

        printf("\n");   
        pFirst = addQuestion(pFirst, pTemp);        
        if(*sTemp == EOF) break;
    }
    fclose(pFile);

    return pFirst;
}

プログラムが 3 番目の質問の難易度を読み取ろうとすると、3 回目の反復でクラッシュします。何が原因で、コードを修正するにはどうすればよいですか?

4

1 に答える 1

1
pQuestionType pTemp = malloc(sizeof(pQuestionType));

pQuestionTypeポインター型である場合(宣言の近くに文字pFirstも含まpTempれていないように見えるため*)、そのサイズはポインターのサイズになります (現在は 4 または 8 になる可能性があります)。

したがって、これmallocではほぼ確実に十分なメモリが得られません。sizeof(*pTemp)代わりに使用する必要があります。

于 2012-12-08T14:38:39.560 に答える