Tại sao mình nhập fflush(stdin); thì chương trình vẫn nhận dấu enter,

đang học C++ được một bữa à :v mà sao tới bài 6 có chút thắc mắc nên ai biết giải đáp mình với

Tại sao mình nhập fflush(stdin); thì chương trình vẫn nhận dấu enter, mình phải dùng cin.ignore(1) để thay thế, mình đang sử dụng VS 2015

fflush là hàm dành cho output stream, stdin là input stream. Gọi fflush(stdin); thì ko bảo đảm là standard input sẽ được xóa hết.

C++ thì tạm viết ngắn gọn là cin.ignore(100, '\n'); Cái này vẫn ko đúng hết mọi trường hợp, ví dụ users họ nhập 101 khoảng trắng rồi mới enter thì cũng ko đúng.
viết đúng phải là: cin.ignore(numeric_limits<streamsize>::max(), '\n');. Để xài numeric_limits thì phải có #include <limits>
tuy nhiên vẫn gặp trường hợp người sử dụng họ ko nhập số mà nhập chữ thì lúc này input stream sẽ bị lỗi, ignore cũng ko xi nhê. Vậy để cho chắc luôn thì thêm cin.clear(); trước khi ignore:

đầy đủ là:

cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');

vì nó phức tạp và dài dòng nên người ta thường viết fflush(stdin); cho lẹ, nhưng nó ko đúng. Có trình dịch chịu flush input stream, có trình dịch sẽ kiểm tra stream truyền vào là input stream hay output stream, nếu là input stream thì ko làm gì cả. VS 2015 làm vậy rất là đúng :sweat_smile:

4 Likes

oke ,cảm ơn nhé , rất bổ ích

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