gõ ký tự thì cin >> n
nó đọc lỗi, nó set flag lỗi ở trong cin
nên ko đọc tiếp được nữa. Cách chữa là gọi cin.clear()
cho nó reset lại cái flag lỗi kia, và ignore hết các ký tự còn trong buffer của cin
bằng cách gọi cin.ignore(numeric_limits<streamsize>::max(), '\n')
:V
while (1) {
int t;
cout << "Nhap t: ";
if (cin >> t) { // nếu nhập cin >> t thành công
if (t == 1) {
cout << "1\n";
} else if (t == 2) {
cout << "2\n";
}
// ko phải 1 2 thì bỏ qua, để vòng lặp sau lấy input lại
} else { // nhập cin >> t thất bại, có thể là do input có ký tự khác chữ số
cin.clear(); // xóa failbit trong cin
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // include thêm header <limits>
}
}
code thế này thì nhập “1”, “2” nó vào if t == 1 2 ở trên, nhập “3”, “456” gì nó bỏ qua, nhập “abc defg” nó vào cái else ở dưới, nhập vào “123abc” thì nó chạy tận 2 vòng lặp, vòng lặp thứ nhất nhập 123 vào t, rồi lần lặp thứ 2 là đọc thất bại, vào cái else cuối kia clear và ignore hết “abc”
cin >> t đọc vào thất bại thì flag failbit được set là true trong cin, nên phải gọi cin.clear() để set failbit thành false trước, rồi mới ignore hết các ký tự còn sót lại trong buffer của cin sau. cin.ignore(X, Y)
thì X là số lượng ký tự tối đa cần bỏ qua, cho tới khi gặp ký tự Y thì dừng. Ví dụ cin.ignore(10, '\n')
thì với buffer còn sót lại các ký tự “abcde\n” thì nó ignore hết, nhưng với “abc123456789\n” thì nó chỉ ignore 10 ký tự “abc1234567”, buffer vẫn còn sót lại “89\n”, nên cần viết numeric_limits<streamsize>::max()
để bảo đảm nó ignore hết :V cái streamsize max value này là 1 số khá lớn, có thể là 2 tỷ hay 4 tỷ hay 2^63 2^64 gì đấy ko cần biết, chỉ biết là viết thế này là bảo đảm buffer của cin được ignore hết :V