您好我必须创建一个数据库,用于存储学生编号,姓名,并在C编程语言中存储一系列课程标记(1-N)。
一切顺利,直到我开始编写课程标记数组。然后每当我编译代码时,它一旦要求输入课程标记就会一直崩溃。
你可以告诉我在我的编程中我遇到了什么问题吗?我已将其附加到此消息中。
该程序用于输入姓名,学号,但是我无法让程序输入标记数组。我已经询问要输入多少个课程标记,然后在" void insert(void)"中使用for循环。功能,以保持输入课程标记到数组*标记。我在编程代码中特指第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");
}
}
}
答案 0 :(得分:1)
似乎是一个错误:
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]));
}
答案 1 :(得分: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");
}
}
有三个有问题的陈述:
scanf("%s", &list[num_students].name);
这就是为什么初学者应该使用启用了所有警告的编译器。printf("Mark: %d /100 \n", list[i].marks);
您首先声明marks
是什么意思?scanf("%d", num_marks);
似乎您将&
运算符放在不需要的位置,并忽略所需的位置。在下次提问之前阅读您的教科书。看起来你很难理解数组和指针的概念。在冒险进入指针世界之前,请仔细阅读您的教科书。如果你没有正确使用它们,即使编译器也无法帮助你。
此外,即使我不希望您的程序具有强大的输入机制,至少需要进行数组边界检查。从一开始就学好习惯。他们将在以后调试时节省大量时间。