Lập Trình Hướng Đối Tượng C++ | Nguyen Minh Vuong Blog

khi ta nhập từ bàn phím bằng lệnh scanf, gets,.. thì tất cả đều được lưu vào bộ đệm hay tệp stdin bàn phím phần kí tự cuối cùng như ‘ \n ‘ với lệnh scanf(); lệnh này cho phép nhập từ bàn phím nhưng không đọc kí tự trắng ‘\n’ vậy khi ta nhập từ bàn phím 1 số ví dụ 4. để làm được điều này đầu tiên ta phải ấn số 4 từ bàn phím sau đó ấn Enter. do tính chất của hàm scanf không đọc kí tự trắng cũng như Enter nên lệnh scanf sẽ đọc lần lượt từ trái qua phải gặp số 4 nó lưu vào trong biến tiếp tục gặp kí tự xuống dòng ( Enter <=> ‘\n’) kí tự này hàm scanf ko đọc nên nó được lưu vào bộ đệm bàn phím. nếu sau lệnh scanf này ta lại dùng lệnh scanf khác thì không có vấn đề gì

nhưng một trường hợp đặt ra đề bài yêu cầu bạn nhập thông tin của một sinh viên đầu tiên là nhập mã sinh viên (kiểu sữ liệu số ), sau là nhập tên, cuối cùng là điểm. vậy như thông thường các bạn sẽ viết printf("nhap ma sinh vien"); scanf("%d",&msv);

printf("nhap ho va ten "); gets(ten); printf("nhap diem"); scanf("%f",&diem); lúc này khi nhập ta vẫn nhập như bình thường giả sủ mã sinh viên là 04. Vậy lệnh scanf() sẽ đọc được số 04 và lưu vào biến msv. còn lệnh Enter ( \n) sẽ được lưu vào bộ đệm bây giờ máy sẽ tiếp tục chạy đến lệnh gets() để nhập tên. do tính chất của hàm này là đọc cả kí tự trắng và kí tự xuống dòng nhưng sẽ ko cho kí tự xuống dòng vào xâu ten. nhưng hàm này lại hoạt động như sau. đầu tiên nó đọc hết ở bộ đệm và tệp stdin nếu có kí tự đang nằm trong đó nó sẽ lấy và sẽ dừng lại khi gặp kí tự xuống dòng nếu không có thì nó lại dừng màn hình cho ta nhập 1 xâu từ bàn phím và đợi gõ enter. vậy nên khi này gets(ten); sẽ đọc trong bộ đệm trước và nó gặp ngay kí tự xuống xòng ‘\n’ thì theo tính chât của hàm này nó sẽ dừng lại và ko cho kí tự xuống dòng vào xâu. nên nó sẽ ko dừng lại màn hình cho ta nhập xâu mà lại chạy tiếp đến biến nhập điểm. trường hợp này được dân IT gọi là trôi lệnh.

vậy để tránh bị trôi lệnh ta sẽ dùng hàm fflush() hàm này có đối truyền vào là tên tệp chứa bộ đệm của trình dịch. trong phần này nó chính là tệp stdin. ta gọi hàm như sau fflush(stdin); hàm này có tác dụng làm sạch vùng nhớ của đối số truyền vào. nó chính là tệp stdin và để cho hàm hoạt động có hiệu quả thì ta nên đặt hàm này ngay trước hàm gets()

fflush(stdin); // đến đây bộ nhớ đệm không còn kí tự '\n' nữa gets(ten);

Từ khóa » Bộ đệm Stdin