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.
Bài liên quan
nếu bạn nhập chuỗi thì hãy dùng
getline
thay choscanf
vìscanf
không nhận các kí tự khoảng trắng các kiểuscanf("%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
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.
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.