简单循环中无法解释的分段错误,适用于两个 if 语句,但不适用于三个?

问题描述 投票:0回答:1

发生了很多事情,所以我在 add 函数中放置了一些箭头指向 if 语句,这些语句破坏了代码。当我仅使用 2/3 的 if 语句(需要检查假值)测试代码时,它运行得很好,但如果我添加最后一个 if 语句,则会出现段错误。不知道问题是什么,请帮忙。

#include<stdio.h>
#include<string.h>
#include<ctype.h>


typedef struct{

    char name[50];
    double havg;
    double qavg;
    double eavg;

}gradebook_t;


int addStudent(gradebook_t classr[], int currentstudents, int capacity);
int removeStudent(gradebook_t classr[], int currentstudents);
void updateStudent(gradebook_t classr[], int currentstudents, char name[]);
void displayStudents(gradebook_t classr[], int currentstudents);
void missingStudent(gradebook_t classr[], int currentstudents);


int main()
{
    gradebook_t classr[5];
    
    int capacity = 5;
    int currentstudents = 0;
    int selection;
    int x = 0;
    char nameUpdate[50];
    
    while(x == 0)
    {
        printf("Choose a selection:\n");
        printf("1. Add a student\n");
        printf("2. Display students\n");
        printf("3. Remove a student\n");
        printf("4. Update a student's info\n");
        printf("0. Exit\n");
        
        scanf("%d",&selection);
        
        if(selection == 1)
        {
            currentstudents += addStudent(classr,currentstudents,capacity);
        }
        else if(selection == 2)
        {
            displayStudents(classr, currentstudents);
        }
        else if(selection == 3)
        {
            currentstudents += removeStudent(classr, currentstudents);
        }
        else if(selection == 4)
        {
            printf("What is the name of the student you would like to update?\n");
            scanf("%s",nameUpdate);
            
            updateStudent(classr,currentstudents,nameUpdate);
        }
        else if(selection == 0)
        {
            x += 1;
        }
        else
        {
            printf("Not a selection, try again...\n");
            printf("currentstudents = %d",currentstudents);
        }
    }
    


    return 0;
}


int addStudent(gradebook_t classr[], int currentstudents, int capacity)
{
    if(currentstudents != capacity)
    {
        printf("Enter a student name:");
        scanf("%s", classr[currentstudents].name);
        
        printf("Enter a homework average:");
        scanf("%lf", &classr[currentstudents].havg);
   
    if(classr[currentstudents].havg < 0 || classr[currentstudents].havg > 100)     // <----------
    {
        classr[currentstudents].havg = 0;
    }

        printf("Enter a quiz average:");
        scanf("%lf", &classr[currentstudents].qavg);
   
    if(classr[currentstudents].qavg < 0 || classr[currentstudents].qavg > 100)     // <---------
    {
        classr[currentstudents].qavg = 0;
    }

        printf("Enter an exam average:");
        scanf("%lf", &classr[currentstudents].eavg);
   
    if(classr[currentstudents].eavg < 0 || classr[currentstudents].eavg > 100)     // <-------
    {
        classr[currentstudents].eavg = 0;
    }
    
    }
    else
    {
        printf("The class is full...\n");
    }
 
}


void displayStudents(gradebook_t classr[], int currentstudents)
{
    for(int index = 0; index < currentstudents; index++)
    {
        printf("Student %d Name : %s\n",index+1, classr[index].name);
        printf("Student %d HW AVG : %.2lf\n",index+1, classr[index].havg);
        printf("Student %d QUIZ AVG : %.2lf\n",index+1, classr[index].qavg);
        printf("Student %d EXAM AVG : %.2lf\n\n",index+1, classr[index].eavg);
    }
}

int removeStudent(gradebook_t classr[], int currentstudents)
{
    char find1[20];
    int x = 0;

    printf("Enter a student name:");
    scanf("%s",find1);
    
    for(int index = 0; index < currentstudents; index++)
    {
        if(strcmp(find1,classr[index].name) == 0)
        {
            classr[index] = classr[currentstudents-1];
            x = -1;
        }
    
    }
    
    
    return x;
}

void updateStudent(gradebook_t classr[], int currentstudents, char name[])
{
    double havg2;
    double qavg2;
    double eavg2;

    for(int index = 0; index < currentstudents; index++)
    {
        if(strcmp(name,classr[index].name) == 0)
        {
            printf("Please update the following:\n");
            
            printf("HW AVG:\n");
            scanf("%lf",&havg2);
            classr[index].havg = havg2;
            
            printf("QUIZ AVG:\n");
            scanf("%lf",&qavg2);
            classr[index].qavg = qavg2;
            
            printf("EXAM AVG:\n");
            scanf("%lf",&eavg2);
            classr[index].eavg = eavg2;
            
        }
    
    }
}

void missingStudent(gradebook_t classr[], int currentstudents)
{

    int x = 0;
    
    printf("Students with missing info:\n");
    
    for(int index = 0; index < currentstudents; index++)
    {
        if(classr[index].havg == 0)
        {
            x += 1;
        }
        if(classr[index].qavg == 0)
        {
            x += 1;
        }
        if(classr[index].eavg == 0)
        {
            x += 1;
        }
        
        if(x>0)
        {
            printf("%s",classr[index].name);
        }
    
    }

}


c if-statement segmentation-fault
1个回答
0
投票

这甚至不是调试 - 请阅读编译器警告:函数 addStudent() 必须返回一个值,由 currentstudents += addStudent(...) 使用; – 风向标

他的言语真的很美妙,爱你,兄弟。 ^^

© www.soinside.com 2019 - 2024. All rights reserved.