Nhập dữ liệu vào mảng cấu trúc trong C

Chào mọi người, mình mới học C đang làm lab xây dựng chương trình lưu thông tin sinh viên.
Input: Nhập vào từ bàn phím các thông tin sinh viên như: mã số sinh viên, tên sinh
viên, ngành học, điểm trung bình.
Output: Xuất ra thông tin của tất cả sinh viên trên màn hình
Đây là code của mình:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

struct SinhVien
{
    char maSV[50];
    char tenSV[50];
    char nganhhoc[50];
    float diemTB;
};
int main(int argc, char *argv[])
{
 struct SinhVien mangSV[50];
    int i,n;
    printf("Nhap so luong sinh vien moi them : ");
    do
    {
        scanf("%d",&n);
        if(n<=0)
        {
            printf("Nhap lai so sinh vien: ");
        }
    }
    while(n<=0);
    printf("Nhap thong tin moi sinh vien: \n");
    for(i=0; i<n; i++)
    {
        fflush(stdin);
        printf("Nhap ma sinh vien: ");
        scanf("%s",&mangSV[i].maSV);
        printf("Nhap ten sinh vien: ");
        gets(mangSV[i].tenSV);
        printf("Nhap nganh hoc: ");
        gets(mangSV[i].nganhhoc);
        printf("Nhap diem trung binh: ");
        scanf("%f",&mangSV[i].diemTB);
    }
    printf("Thong tin sinh vien vua nhap la: ");
    for(i=0; i<n; i++)
    {
        printf("Ma sinh vien: %s\n", mangSV[i].maSV);
        printf("Ten sinh vien: %s\n", mangSV[i].tenSV);
        printf("Nganh hoc: %s\n", mangSV[i].nganhhoc);
        printf("Diem trung binh: %f\n", mangSV[i].diemTB);
    }
 return 0;
}

Vấn đề mình gặp phải là lúc đầu mình có sử dụng hàm scanf để nhập thông tin vào mảng nhưng vì scanf ko nhận khoảng trống ở phần họ tên đẩy tên xuống phần ngành học vì vậy mình đổi sang dùng gets nhưng vấn đề là mình chỉ nhập được mã sinh viên sau đó chương trình bỏ qua bước nhập họ tên và nhảy đến phần nhập ngành học và điểm, phần tử thứ 2 trong mảng khi nhập vào cũng vậy, mình đã tìm đọc lại tài liệu nhưng vẫn không hiểu tại sao, và cách nhập như thế nào, mong các bạn giúp đỡ giải đáp, mình xin cảm ơn!

Kí tự xuống dòng ở phần nhập số đã được nhận luôn vào phần chuỗi.
Vấn đề muôn thuở!
Có vài cách để tránh vấn đề này:

  • Đặt scanf("%*c") sau nhập số. Tạm ổn.
  • Đặt scanf("%*[^\n]%*[\n]") sau nhập số. Chỉ siêu ổn nếu dùng dùng Enter sau khi nhập số.
  • Nhập trên dòng, không dùng chung với 2 cách trên.

:relieved:

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