1

所以我正在尝试编写一个程序,我需要在其中输入多个学生的姓名、姓氏、学生证、生日等信息。问题是我无法让它为所有学生打印信息。我编写的这个版本的代码只打印了变量,其中没有存储任何内容或带有一些奇怪的字符。在脚本的早期版本中,我输入的信息只会覆盖以前的信息,并且只会打印一个学生的信息。如果我没记错的话,我想我需要在 for 循环中进行一些更改。如果有人可以帮我一把,我将不胜感激。

这是代码:

#include <stdio.h>
#include <string.h>
#define students 200



typedef struct {
    char name[20];
    char surname[20];
    int studentid[5];
    int day[5];
    int month[5];
    int year[5];
}student;

int main(){ 
    student a[students];
    int j;
    int n;
    int i;  
    int choice;
    for(i=0;i<=students;i++){           
        printf("\n===========================================================\n");
        printf("\n1 Enter info for a student");
        printf("\n2 Print all the students");
        printf("\n3 End\n");
        printf("\n===========================================================\n");
        printf("\nChoose something ---> ");
        scanf("%d", &choice);
        switch(choice)
        {
            case 1:
                printf("Enter name: \n");
                scanf("%s", a[students].name);
                printf("Enter surname: \n");
                scanf("%s", a[students].surname);
                printf("Enter student ID: \n");
                scanf("%s", a[students].studentid); 
                printf("Enter day: \n");
                scanf("%s", a[students].day);
                printf("Enter month: \n");
                scanf("%s", a[students].month);
                printf("Enter year: \n");
                scanf("%s", a[students].year);                                      
                break;
            case 2:
                for(i=0;i<students;i++)
                {
                    printf("\nNome student: %s\nSurname student: %s\nStudent id: %s\nStudent Birthday: %s.%s.%s\n", a[i].name, a[i].surname, a[i].studentid, a[i].day, a[i].month, a[i].year);
                }
                break;
            case 3:
                break;
            default:
                printf("Choose again!\n");

        }

    } 
    return 0;
}

谢谢!

4

2 回答 2

2
  1. 编译时是否看到警告:

警告:格式“%s”需要“char *”类型的参数,但参数 2 的类型为“int *”[-Wformat=]

对于字符串,您应该使用字符数组,因此结构的参数student应该更改为:

    char studentid[10];
    char day[10]; // 5 is too short, for example monday need at lest 7 characters (1 for null character at the end of string)
    char month[10];
    char year[10];
  1. 您声明了数组,length = students但您尝试访问(students+1)th( a[students])

for循环应更改为:

for(i=0;i < students;i++){} // i from 0 to students-1 not to students.

您应该使用计数器(count例如,您可以声明变量)来计算您输入信息的学生人数。当您打印这些学生的信息时,它将很有用。

                printf("Enter name: \n");
                scanf(" %19s", a[count].name);
                printf("Enter surname: \n");
                scanf(" %19s", a[count].surname);
                printf("Enter student ID: \n");
                scanf(" %9s", a[count].studentid); 
                printf("Enter day: \n");
                scanf(" %9s", a[count].day);
                printf("Enter month: \n");
                scanf(" %9s", a[count].month);
                printf("Enter year: \n");
                scanf(" %9s", a[count].year);
                count++; // increase count after each student
                break;

case 2更改为:

                for(int j=0;j<count;j++) // just print the students that you set the info in case 1.
                {
                    printf("\nNome student: %s\nSurname student: %s\nStudent id: %s\nStudent Birthday: %s.%s.%s\n", a[j].name, a[j].surname, a[j].studentid, a[j].day, a[j].month, a[j].year);
                }
                break;

这行:#define students 200没有错,但是你应该使用不同的名称并使用大写,这样更容易理解常量值,例如:

#define MAX_NUM_STUDENTS 200

完整代码:

#include <stdio.h>
#include <string.h>
#define MAX_NUM_STUDENTS 200

typedef struct {
    char name[20];
    char surname[20];
    char studentid[10];
    char day[10];
    char month[10];
    char year[10];
}student;

int main(){ 
    student a[MAX_NUM_STUDENTS];
    int i, n, choice, count = 0;
    for(i=0;i<MAX_NUM_STUDENTS;i++){           
        printf("\n===========================================================\n");
        printf("\n1 Enter info for a student");
        printf("\n2 Print all the students");
        printf("\n3 End\n");
        printf("\n===========================================================\n");
        printf("\nChoose something ---> ");
        scanf("%d", &choice);

        switch(choice)
        {
            case 1:
                printf("Enter name: \n");
                scanf(" %19s", a[count].name);
                printf("Enter surname: \n");
                scanf(" %19s", a[count].surname);
                printf("Enter student ID: \n");
                scanf(" %9s", a[count].studentid); 
                printf("Enter day: \n");
                scanf(" %9s", a[count].day);
                printf("Enter month: \n");
                scanf(" %9s", a[count].month);
                printf("Enter year: \n");
                scanf(" %9s", a[count].year);   
                count++;
                break;
            case 2:
                for(int j=0;j<count;j++) // just print the students that you set the info in case 1.
                {
                    printf("\nNome student: %s\nSurname student: %s\nStudent id: %s\nStudent Birthday: %s.%s.%s\n", a[j].name, a[j].surname, a[j].studentid, a[j].day, a[j].month, a[j].year);
                }
                break;
            case 3:
                break;
            default:
                printf("Choose again!\n");
        }

    } 
    return 0;
}
于 2020-05-20T20:34:34.987 回答
0

您将用户输入存储在a[students]. 然而,数组a(顺便说一下,你应该用你的变量名来描述)只有students-elements 长。因此,第students- 个元素超过了数组的末尾。

于 2020-05-20T20:12:20.967 回答