01/10/2018, 09:23

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ự “ ” 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.

Hoàng Trung viết 11:36 ngày 01/10/2018

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
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

Hiep viết 11:35 ngày 01/10/2018

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.

Hoàng Trung viết 11:32 ngày 01/10/2018
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.

Hiep viết 11:26 ngày 01/10/2018

ý 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.

Bài liên quan
0