2011-09-14 37 views
8

Tôi có vòng lặp sau đây. Nó nên đọc số cho đến khi EndOfFile, hoặc người dùng nhập -999cin.clear() không đặt lại đối tượng cin

int arr[100]; 

int index; 

for (index = 0; index < 100; index++) 
{ 
cin >> arr[index]; 
if (!cin) 
{ 
    cin.clear(); 
    index--; 
    continue; 
} 
if (arr[index] == -999) 
{ 
    break; 
} 
} 

Khi người dùng nhập vào một điều không hợp lệ, chẳng hạn như một số char s, vòng lặp này được lặp đi lặp lại mãi mãi mà không clear ing tình trạng lỗi hoặc dừng lại.

Trả lời

8

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.

+1

Do đó vòng lặp vô hạn !! –

+0

@ Mr.DDD: Chính xác. :-) – Nawaz

+0

@ Mr.DDD: Dữ liệu nhập vào không hợp lệ của bạn? – Nawaz

Các vấn đề liên quan