【问题标题】:Variable does not increment though did not define变量虽然没有定义但不会增加
【发布时间】:2017-10-03 15:04:06
【问题描述】:

正如你们所看到的,我没有定义变量“n_students”,因此它应该能够毫无问题地递增,但事实并非如此。当我把它放在用户定义函数中时它也不会增加,那么这里的问题似乎是什么?

#define MAX_CLASS_SIZE 5
#define MAX_NAME_SIZE 11

    int main(void){
        student_t studentlist[MAX_NAME_SIZE];
        int n_students = 0; 
        int result;
        /* TODO */

        while (1){
        printMenu();
        int choice;
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                if (n_students == MAX_CLASS_SIZE) {
                    printf("Class is full\n");
                }
                else {
                    addStudent(studentlist, n_students);
                    n_students++;
                }
  case 2:
            if (n_students == 0) {
                    printf("Class is empty\n");
                } else {
                    n_students--;
                }
                break;
        case 3:
            if (n_students == 0){
                    printf("Class is empty\n");
                } 
                else {
                    displayStudents(studentlist, n_students);
                } 
                break;
        case 4:
            saveDatabase(studentlist, n_students);
                break;
        case 5:
            result = loadDatabase(studentlist);
            if (result >= 0){
                n_students = result;
            }
            break;
        case 6:
            return 0;
        default:
            printf("Invalid choice.\n");
            break;
            }
    }

}


void addStudent(student_t *studentlist,int n_students)
{
    char name[1024];
    printf("Enter name>");
    scanf("%s", name);
    name[MAX_NAME_SIZE-1]= '\0';
    strcpy(studentlist[n_students].name, name);

    int day,month,year;
    while (1){
        printf("Enter birthday: day>");
        scanf("%d", &day);
        if (day >= 1 && day <=31){
            break;
        }
        printf("Invalid day. ");
    }

    while (1){
        printf("Enter birthday: month>");
        scanf("%d", &month);
        if(month >= 1 && month <= 12){
            break;
        }
        printf("Invalid month. ");
    }

    while (1){
        printf("Enter birthday: year>");
        scanf("%d", &year);
        if (year >= 1800 && year <= 2017){
            break;
        }
        printf("Invalid year. ");
    }

    float gpa;
    while (1){
        printf("Enter GPA>");
        scanf("%f", &gpa);
        if (gpa >= 0.0 && gpa <= 4){
            break;
        }
        printf("Invalid GPA. ");
    }

    studentlist[n_students].birthday.day = day;
    studentlist[n_students].birthday.month = month;
    studentlist[n_students].birthday.year = year;
    studentlist[n_students].gpa = gpa;
}

【问题讨论】:

  • 这里没有足够的信息来回答。请处理 MCVE (minimal reproducible example),以便我们看到真正的问题。就目前而言,当您添加学生时,n_students 应该递增,除非MAX_CLASS_SIZE 为零。
  • 请注意,您使用了两个不同的宏:MAX_NAME_SIZEMAX_CLASS_SIZE
  • 缺少break; 意味着您之后会遇到n_students--;。调试器会告诉你的。
  • scanf("%s", name); name[MAX_NAME_SIZE-1]= '\0'; 也很糟糕
  • 在您知道如何使用调试器之前,请不要再编写任何代码。 TBH,你已经晚了一个应用程序:(

标签: c variables increment post-increment


【解决方案1】:

首先你在case 1之后错过了break

    switch (choice)
    {
        case 1:
            if (n_students == MAX_CLASS_SIZE)
            {
                printf("Class is full\n");
            }
            else
            {
                addStudent(studentlist, n_students);
                n_students++;
            }
            break; <----------------------
        case 2:

否则case 2 被执行,n_students--; 被执行。

此外,您的代码正在检查数组索引 n_stundent

if (n_students == MAX_CLASS_SIZE)

所以数组大小应该是

student_t studentlist[MAX_CLASS_SIZE];

【讨论】:

    猜你喜欢
    • 2020-08-05
    • 2011-11-10
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    相关资源
    最近更新 更多