【问题标题】:C: Array of Structs (Input into int array within array of structs)C:结构数组(输入到结构数组中的 int 数组)
【发布时间】:2016-02-07 13:11:54
【问题描述】:

您好,我必须创建一个数据库,用于存储学生编号、姓名,并在 C 编程语言中存储一系列课程分数 (1-N)。

在我开始为课程标记数组编码之前,一切正常。然后每次我编译代码时,只要它要求输入课程分数,它就会一直崩溃。

你能告诉我我在这个任务的编程中哪里出错了吗?我已将其附加到此消息中。

程序可以输入姓名、学号,但是我无法让程序输入分数数组。我已经询问了要输入多少课程分数,然后在“void insert(void)”函数中使用了一个 for 循环来继续将课程分数输入到数组 *marks 中。我特指我的编程代码中的第 24 到 30 行。

此时程序总是崩溃,我无法继续输入更多姓名或打印存储的学生详细信息。

我觉得这部分有问题:

for (i= 0; i < num_marks; i++)
{
    printf("Enter Course Mark: \n");
    scanf("%d", &(list[num_students].marks[num_marks]));
}

这里是完整的代码:

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

struct student{
    int number;
    char name[10];
    int marks[5];
};
struct student list[10];

int num_students = 0;
int num_marks = 0;
int *p;

void insert(void)
{
    int student_number;
    int i;
    printf("Enter number: \n");
    scanf("%d", &list[num_students].number);
    printf("Enter NAME: \n");
    scanf("%s", &list[num_students].name);
    printf("Enter NO of courses: \n");
    scanf("%d", num_marks);
    for (i= 0; i < num_marks; i++)
    {
        printf("Enter Course Mark: \n" );
        scanf("%d", &(list[num_students].marks[num_marks]));
    }
    num_students++; // HOW DO WE INPUT ARRAY MARKS??? MARK1: , MARK2: , MARK3 ,
}

void printtest(void)
{
    int i;
    for (i=0; i < num_students; i++)
    {
        printf("Name: \n");
        puts(list[i].name);
        printf("Number: %d \n", list[i].number);
        printf("Mark: %d /100 \n", list[i].marks);
        printf("\n");
    }
}

int main(void)
{
    int code;
    int opt1;
    int courses, i, k, j, counter;
    for (;;){
        printf("Enter operation code: \n");
        printf("(1) ADD NEW STUDENT DETAILS: \n");
        printf("(2) DISPLAY REPORT OF ALL STUDENTS: \n");
        scanf(" %d", &code);
        switch (code){
            case 1 :
                insert();
                break;
            case 2 :
                printtest();
                break;
            default:
                printf("Illegal code\n");
                printf("\n");
        }
    }
}

【问题讨论】:

    标签: c arrays data-structures struct static-members


    【解决方案1】:

    除了其他人指出的,我想提请您注意以下几点:

    void insert(void)
        {
            int student_number;
            int i;
            printf("Enter number: \n");
            scanf("%d", &list[num_students].number);
            printf("Enter NAME: \n");
            scanf("%s", &list[num_students].name);
            printf("Enter NO of courses: \n");
            scanf("%d", num_marks);
            for (i= 0; i < num_marks; i++)
            {
                printf("Enter Course Mark: \n" );
                scanf("%d", &(list[num_students].marks[num_marks])); 
            }
            num_students++; 
        }
    
        void printtest(void)
        {
            int i;
            for (i=0; i < num_students; i++)
            {
            printf("Name: \n");
            puts(list[i].name);
                printf("Number: %d \n", list[i].number);
                printf("Mark: %d /100 \n", list[i].marks);
            printf("\n");
            }
        }
    

    有三个有问题的说法:

    1. scanf("%s", &amp;list[num_students].name); 这就是为什么初学者应该使用启用所有警告的编译器。
    2. printf("Mark: %d /100 \n", list[i].marks); 你最初声明marks 是什么?
    3. scanf("%d", num_marks); 似乎您将 &amp; 运算符放在不需要的地方,而在需要的地方忽略。下次提问前先阅读教科书。

    您似乎很难理解数组和指针的概念。在冒险进入指针世界之前,请仔细阅读您的教科书。如果你没有正确使用它们,即使是编译器也帮不了你。

    此外,即使我不希望您的程序具有强大的输入机制,至少也需要进行数组边界检查。从一开始就学习好习惯。它们会在以后调试时为您节省大量时间。

    【讨论】:

    • 感谢您的建议。你还能告诉我插入功能哪里出错了吗?我更关心为什么我不能输入学生分数。
    • 是的,但它现在只能工作,因为它以固定的 no(即 4)递增,不像用户定义的 num_marks 之前那样
    • for (i= 0; i
    • 您是否在num_marks中输入了大于5的数字?
    • 没有,即使我在 num_marks 中输入 2 程序也崩溃了
    【解决方案2】:

    似乎是一个错误:

    for (i= 0; i < num_marks; i++)
    {
        printf("Enter Course Mark: \n" );
        scanf("%d", &(list[num_students].marks[num_marks]));
    }
    

    崩溃可能是因为num_marks作为索引索引超出了数组。改为:

    for (i= 0; i < num_marks; i++)
    {
        printf("Enter Course Mark: \n" );
        scanf("%d", &(list[num_students].marks[i]));
    }
    

    【讨论】:

    • 感谢您的帮助...但是即使我将 &(list[num_students].marks[num_marks])) 更改为 &(list[num_students].marks[i])) 程序仍然坠毁。你知道还有什么问题吗?
    • 另请参阅@Mayank-Verma 解决更多问题的答案。
    猜你喜欢
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多