Khắc phục lặp vô hạn khi nhập sai giá trị (vòng lặp: do-while)

Nhờ mọi người!
Khi đến phần nhập choice (kiểu int), em nhập ký tự thì chương trình bị lặp vô hạn. Có cách nào để chương trình hiểu là nhập sai và yêu cầu nhập lại không ạ!
Em cảm ơn!
Code:

void CongTy::Nhap() {
	cout << "\n1. Nhap nhan vien san xuat";
	cout << "\n2. Nhap nhan vien quan ly";
	cout << "\n3. Nhap nhan vien van phong";
	cout << "\n4. Thoat";
	int choice = 0;
	do {
		cout << "----- Lua chon cua ban la: ";
		
		do {
			cin >> choice;
			if (choice == 1) {
				NhanVienSX sx;
				sx.Nhap();
				NhanVienSanXuat.push_back(sx);
			}
			else if (choice == 2) {
				NhanVienQL ql;
				ql.Nhap();
				NhanVienQuanLy.push_back(ql);
			}
			else if (choice == 3) {
				NhanVienVP vp;
				vp.Nhap();
				NhanVienVanPhong.push_back(vp);
			}
			else if (choice !=4){
				cout << "\nBan da nhap sai! Moi nhap lai: ";
			}
		} while (choice < 1 && choice > 4);
	} while (choice != 4);
}

Thay vì nhập số, hãy nhập chuỗi (string) và kiểm ra hợp lệ.
Nếu đúng là số thì chuyển chuỗi sang số, nếu không đúng thì yêu cầu nhập lại.

5 Likes

Ngoài cách nhập chuỗi và convert, thì còn 1 cách là kiểm tra thêm trạng thái của std::cin.
Tham khảo thêm tại https://isocpp.org/wiki/faq/input-output#stream-input-failure

3 Likes
do {
    if (cin >> choice) { // nhập choice thành công
        //if else if else ...
    } else { // nhập choice thất bại (có thể là vì nhập chữ thay vì số)
        cin.clear(); // reset cin lại vì hiện tại cin bị lỗi ko nhập được nữa, làm lặp vô tận
        cin.ignore(100, '\n'); // bỏ qua các ký tự ko hợp lệ, tối đa 100 ký tự. Nếu em muốn nhiều hơn thì để 1000 10000 cũng được, hoặc tối đa là numeric_limits<streamsize>::max()
    }
} while (...);
4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?