Sau khi gọi clear
, bạn đã bằng cách nào đó xóa đầu vào không hợp lệ khỏi luồng. Dưới đây là một cách:
cin >> arr[index];
if (!cin)
{
cin.clear();
std::string ignoreLine; //read the invalid input into it
std::getline(cin, ignoreLine); //read the line till next space
index--;
continue;
}
Vì không đọc được đầu vào không hợp lệ, nó vẫn ở đó trong luồng. Nó phải được loại bỏ, bằng một số phương tiện. Tôi chỉ đọc và bỏ qua nó.
Bạn cũng có thể sử dụng ignore
như:
cin.clear();
cin.ignore(std::numeric_limits<streamsize>::max(),' ');
mà là tốt hơn theo ý kiến đóng góp ý kiến của tôi là gian tách ra (và nếu bạn không muốn kiểm tra đầu vào không hợp lệ). Các online doc nói:
istream :: bỏ qua
istream & bỏ qua (streamsize n = 1, int dấu phân cách = EOF);
Extract và loại bỏ ký tự
chiết xuất từ nhân vật trong chuỗi đầu vào và loại bỏ chúng.
Trích xuất kết thúc khi n ký tự được trích xuất và bị hủy hoặc khi tìm thấy dấu phân cách ký tự, tùy điều kiện nào đến trước. Trong trường hợp sau, bản thân ký tự delim cũng được trích xuất.
Do đó vòng lặp vô hạn !! –
@ Mr.DDD: Chính xác. :-) – Nawaz
@ Mr.DDD: Dữ liệu nhập vào không hợp lệ của bạn? – Nawaz