【问题标题】:Why am I getting a segmentation fault error?为什么我会收到分段错误错误?
【发布时间】:2016-11-14 04:14:25
【问题描述】:

我收到分段错误,不确定这意味着什么,但找不到什么问题? Pico 给出了这个错误, 这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
//Struct groups each line in the file
struct gradesRecord
    {
        int iIndex;       // index on the file
        int iStudentNUM;  // 'Student' field
        int iExamGrouped[3];  // 'Exam 1'..'Exam 3' fields
        char cStudentAVG; // 'Grade' field
    };
void printUnsortedStringFromFile(int amount, struct gradesRecord A[]);
void printSortedStringFromFile(int amount, struct gradesRecord A[]);
//bool binSearchNUM(int amount, int A[amount], int target,);

int main()
{
    FILE* spData = fopen("grades.csv", "r");
    int ch, number_of_lines = 0;
    do
    {
        ch = fgetc(spData);
        if (ch == '\n')
            number_of_lines++;
    } while (ch != EOF);

    if (ch != '\n' && number_of_lines != 0)
        number_of_lines++;

    fclose(spData);
    printf("There are %d lines in file grades.csv . \n", number_of_lines);
    int amount = number_of_lines;
    struct gradesRecord A[amount];
    printUnsortedStringFromFile(amount, A );
    printSortedStringFromFile(amount, A );
    //binSearchNUM(int amount, int A[amount], int target, );
    return 0;
}

/*
* Function Name: printUnsortedStringFromFile
*
* Input Parameters: takes array A
*
* Description: This fuction prints the original list that was unsorted in grades.csv
*
* Return Value: void
*/
void printUnsortedStringFromFile(int amount, struct gradesRecord A[])
{
    FILE *spData;
    spData = fopen("grades.csv", "r");
    if(spData == NULL)
    {
        fprintf(stderr, "Error opening the file grades.csv.\n");
        exit(1);
    }

    printf("+-------+------+------+------+-----+\n");
    printf("|Student|Exam 1|Exam 2|Exam 3|Grade|\n");
    printf("+-------+------+------+------+-----+\n");
    char sLine[81]; //local string to read one row
    int j = 0; //storage index
    while((fgets(sLine, 80, spData)) != NULL)
    {
    sscanf(sLine, "%d, %d, %d, %d, %c",
        &(A[j].iStudentNUM), &(A[j].iExamGrouped[0]), &(A[j].iExamGrouped[1]), &(A[j].iExamGrouped[2]),
        &(A[j].cStudentAVG));

    printf("|%7d| %5d| %5d| %5d|    %c| \n",
        A[j].iStudentNUM, A[j].iExamGrouped[0], A[j].iExamGrouped[1], A[j].iExamGrouped[2],
        A[j].cStudentAVG);
    j++; // next row
    }
    printf("+-------+------+------+------+-----+\n");

    if (fclose(spData) == EOF)
    {
        fprintf(stderr, "Error closing the file grades.csv. \n");
        exit(2);
    }
}

/*
* Function Name: printSortedStringFromFile
*
* Input Parameters: takes int amount, struct gradesRecord A
*
* Description: This function prints the sorted version of the file grades.csv omitting
*               the exam values and giving each string a index number
*
* Return Value: void
*/
void printSortedStringFromFile(int amount, struct gradesRecord A[])
{
    FILE *spData;
    spData = fopen("grades.csv", "r");
    if(spData == NULL)
    {
        fprintf(stderr, "Error opening the file grades.csv.\n");
        exit(1);
    }

    char sLine[81];
    int iLine = 0, iRow;
    struct gradesRecord grRow, grTmp;

    while((fgets(sLine, 80, spData)) != NULL)
    {
    // extract one Row and store it into grRow
    sscanf(sLine, "%d, %d, %d, %d, %c",
        &(grRow.iStudentNUM), &(grRow.iExamGrouped[0]), &(grRow.iExamGrouped[1]), &(grRow.iExamGrouped[2]),
        &(grRow.cStudentAVG));
    // keep the line index of that row
        grRow.iIndex = iLine;
    // target loop = insertion sort algorithm
    for (iRow = 0; iRow < iLine; iRow++)
        {
        //  detect if new student is before the store one
        if (grRow.iStudentNUM < A[iRow].iStudentNUM)
        {
            // exchange both student records through grTmp
            memcpy(&grTmp, &(A[iRow]), sizeof(struct gradesRecord));
            memcpy(&(A[iRow]), &grRow, sizeof(struct gradesRecord));
            memcpy(&grRow, &grTmp, sizeof(struct gradesRecord));
        }
    }
    // store the biggest student at the end
        memcpy(&(A[iLine]), &grRow, sizeof(struct gradesRecord));
        iLine++;
    }
        int StudentNUM;
        char StudentAVG;
        int j = 0;
        printf("+-----+-------+-----+\n");
        printf("|Index|Student|Grade|\n");
        printf("+-----+-------+-----+\n");

        int index;
        while (j < amount - 1)
    {
        StudentNUM = A[j].iStudentNUM;
        StudentAVG = A[j].cStudentAVG;
        index = j+1;
        printf("| %4d|%7d|    %c| \n", index, StudentNUM, StudentAVG);
        j++;
    }
        printf("+-----+-------+-----+\n");
    if (fclose(spData) == EOF)
    {
        fprintf(stderr, "Error closing the file grades.csv. \n");
        exit(2);
    }

}

【问题讨论】:

  • 你能通过调试器运行它以找出段错误发生的确切位置吗?

标签: c++ debugging compiler-errors segmentation-fault


【解决方案1】:

使用这种输入格式创建grades.csv

Student,Exam 1,Exam 2,Exam 3,Grade

例如:

1,18,17,14,18
2,15,18,10,16

输出是,没有任何错误,但如果grades.csv 不存在或有错误信息,你会得到Segmentation fault (core dumped)

There are 3 lines in file grades.csv . 

+-------+------+------+------+-----+
|Student|Exam 1|Exam 2|Exam 3|Grade|
+-------+------+------+------+-----+
|      1|    18|    17|    14|    1| 
|      2|    15|    18|    10|    1| 
+-------+------+------+------+-----+
+-----+-------+-----+
|Index|Student|Grade|
+-----+-------+-----+
|    1|      1|    1| 
|    2|      2|    1| 
+-----+-------+-----+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多