Code struct quản lý danh sách sinh viên bị sai

Mình có làm bài tập này, đề bảo là nhập và xuất danh sách sinh viên ra. Sau đó tìm sinh viên có MSSV nhập từ bàn phím, chương trình không lỗi nhưng:

  • Khi xuất danh sách, nó chỉ xuất tên sinh viên nếu số lượng sinh viên là 1, tuy nhiên khi nhập nhiều hơn 1 thì nó sẽ xuất hoàn toàn thông tin các sinh viên đầu đến sinh viên cuối cùng thì chỉ có mỗi tên.
  • Mình không thể in ra được thông tin của sinh viên có MSSV như yêu cầu.

Mong mọi người giúp đỡ.

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


//Danh sach cac ham cau truc
typedef struct NGAYSINH  {
	int Ngay;
    int Thang;
    int Nam;
}ns;


typedef struct SINHVIEN {
	char Hoten[31];
	char MSSV[12];
	ns Ngay;
	char GioiTinh;
	char Lop[8];
	float Toan;
	float Ly;
	float Tin;
}sv;

//Danh sach cac ham can thuc hien
void NhapNgaySinh(ns &x);
void XuatNgaySinh(ns x);
void Nhap1SV(sv *x);
void Xuat1SV(sv *x);
void Nhap_danhsach_SV(int n, sv *a);
void Xuat_danhsach_SV(int n, sv *a);
void Tim_MSSV(int n, sv *a, char MSSV[]);



int main() {
	sv x, *a;
	int n;
	printf("Nhap so luong sinh vien: "); scanf("%d", &n);
	a = new sv[n];
//	Nhap1SV(&x);
//	Xuat1SV(&x);
	Nhap_danhsach_SV(n,a);
	Xuat_danhsach_SV(n,a);
	char MSSV[11];
	printf("\nNhap MSSV can tim: "); scanf("%s", &MSSV);
	Tim_MSSV(n,a, MSSV);
    return 0;
}


//Ham nhap xuat ngay thang nam sinh
void NhapNgaySinh(ns &x) {
	printf("\nNhap ngay: ");
    do{
    	scanf("%d",&x.Ngay);
    	if(x.Ngay<=0||x.Ngay>31) {
    		printf("\nNgay sinh khong hop le, nhap lai");
		}
    }while(x.Ngay<=0||x.Ngay>31);
    printf("\nNhap thang sinh: ");
    do{
    	scanf("%d",&x.Thang);
    	if(x.Thang<=0||x.Thang>12) {
    		printf("\nThang sinh khong hop le, nhap lai");
		}
    }while(x.Thang<=0||x.Thang>12);
    printf("\nNhap nam sinh: ");
    do{
    	scanf("%d",&x.Nam);
    	if(x.Nam<=1900||x.Nam>9999) {
    		printf("\nNam sinh khong hop le, nhap lai");
		}
    }while(x.Nam<=1900||x.Nam>9999);
}


void XuatNgaySinh(ns x) {
    printf("Ngay thang nam sinh la: %d/%d/%d", x.Ngay, x.Thang, x.Nam);
}


//Nhap xuat 1 sinh vien
void Nhap1SV(sv *x) {
	fflush(stdin);
	printf("\nNhap Ho ten: "); gets(x->Hoten);
	printf("\nNhap MSSV: "); scanf("%s", &x->MSSV);
	NhapNgaySinh(x->Ngay);
	fflush(stdin);
	printf("\nNhap gioi tinh (x la nam, y la nu): "); scanf("%c", &x->GioiTinh);
	printf("\nNhap lop hoc: "); scanf("%s", &x->Lop);
	printf("\nNhap diem toan, ly, tin hoc: "); scanf("%f %f %f", &x->Toan, &x->Ly, &x->Tin);
}


void Xuat1SV(sv *x) {
	printf("\nHo ten sinh vien la: "); puts(x->Hoten);
	printf("\nMSSV: "); printf(" %s", x->MSSV);
	XuatNgaySinh(x->Ngay);
	if(x->GioiTinh == 'x') {
		printf("\nGioi tinh la: Nam");
	} else {
		printf("\nGioi tinh la: Nu");
	}
	printf("\nDiem toan, ly, tin hoc lan luot la: %.2f %.2f %.2f", x->Toan, x->Ly, x->Tin);
}


//Nhap xuat danh sach sinh vien
void Nhap_danhsach_SV(int n, sv *a) {
	for(int i=0;i<n;i++) {
		Nhap1SV((a+i));
	}
}

void Xuat_danhsach_SV(int n, sv *a) {
	for(int i=0;i<n;i++) {
		printf("\n--------------SINH VIEN THU %d------------------", i+1);
		Xuat1SV(a+i);	
	}
}



//Ham tim kiem sinh vien co MSSV nhap tu ban phim
void Tim_MSSV(int n, sv *a, char MSSV[]) {
	for(int i=0;i<n;i++) {
		if((a+i)->MSSV == MSSV) {
			printf("\n-----------------Sinh vien co %s nhu yeu cau-------------- ", MSSV);
			Xuat1SV(a+i);
		}
	}
}

mình nghĩ lỗi do xoá bộ nhớ đệm khi nhập và hàm gets.

dùng fflush(stdin) sẽ xoá mất dữ liệu nhập nếu để không đúng chỗ.
-> lý do: Hàm fflush(stdin) dùng để làm gì?
-> cách sử dụng fflush: https://www.geeksforgeeks.org/use-fflushstdin-c/
-> mình nghĩ nên bỏ fflush ngay chỗ sau khi nhập ngày sinh, còn fflush ở đầu thì mình nghĩ nó không có tác dụng, nên đặt fflush ở cuối sau khi nhập.

không nên dùng gets().
->lý do: https://stackoverflow.com/questions/1694036/why-is-the-gets-function-so-dangerous-that-it-should-not-be-used
-> nên dùng fgets((chuỗi cần nhập),(kích thước chuỗi),stdin).

Bạn đã trích 1 link quá cũ về fflush(stdin) rồi. Đúng ra phải không dùng fflush(stdin) nữa.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?