Hỏi về xóa bộ đệm và hàm scanf

void nhap_danhsach(Toado_form2 form2, FILE *file, DanhSachSV DS) {
	
	int i = -1;
	char MaSV[20], Diem[4], Ngay[2], Thang[2], Nam[4];
	do
	{
		fflush(stdin);
		i++;
		gotoxy(form2.x_text[i] - form2.size_text_x / 2 + 1, form2.y_text[i]);
		if (i == 0)
		{
			gets_s(DS.sinhvien[DS.count].Ten);
		}
		if (i == 1)
		{
			scanf("%2d/%2d/%4d", &DS.sinhvien[DS.count].ngaysinh.ngay, &DS.sinhvien[DS.count].ngaysinh.thang, &DS.sinhvien[DS.count].ngaysinh.nam);
		}
		if (i == 2)
		{
			scanf("%s", &MaSV);
			DS.sinhvien[DS.count].MaSV = atoi(MaSV);
		}
		if (i == 3)
		{
			scanf("%s", &DS.sinhvien[DS.count].Malop);
		}
		if (i == 4)
		{
			scanf("%s", &DS.sinhvien[DS.count].Monhoc);
		}
		if (i == 5)
		{
			scanf("%s", &Diem);
			DS.sinhvien[DS.count].Diem = atof(Diem);
		}
	} while (i <= 5);
}

Mọi người cho e hỏi chỗ này sai thế nào mà lúc e nhập phim enter mà nó vẫn lưu lại ký tự “\n” mặc dù đã dùng fflush để xóa bộ đệm. ở các hàm scanf nếu mình ấn enter nó vẫn chỉ xuống dòng chứ không pass qua câu lệnh khác được.

nếu bạn nhập chuỗi thì hãy dùng getline thay cho scanfscanf không nhận các kí tự khoảng trắng các kiểu :stuck_out_tongue:
scanf("%2d/%2d/%4d", &DS.sinhvien[DS.count].ngaysinh.ngay, &DS.sinhvien[DS.count].ngaysinh.thang, &DS.sinhvien[DS.count].ngaysinh.nam);
vì scanf phải đợi dữ liệu người nhập ở nhiều biến nên khi bạn nhấn enter nó chỉ xuống dòng thôi và đợi bạn nhập tiếp :stuck_out_tongue:

Uhm cái đó mình hiểu, nhưng có những dữ liệu kiểu khác mình phải nhập bằng scanf, mà mình có xóa bộ đệm ở đầu vòng lặp để khắc phục rồi. Mà ko hiểu sao nó không hoạt động ở vs 2015 :(. Dung cin.inorge hay fflush đều không đc.

cin.ignore và fflush

bạn nên sử dụng nó trước mỗi lần nhập chuỗi luôn chứ không phải là chỉ dùng ở đầu vòng lặp, vì khi bạn enter để dữ liệu lưu vào thì nó lưu enter ở bộ nhớ đệm dẫn đến hàm nhập phía sau bị bỏ qua.

ý bạn bảo mình để fflush hoặc cin.ignore ở sau các hàm nhập chuôi, nhưng mỗi vòng lặp của mình lại nhập khác và nó chạy vào 1 dòng lệnh khác, nên mình để fflush ở đầu vòng lặp để thay cho việc mỗi dòng scanf hay get lại phải dùng fflush hay cin.ignore.

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