2013-11-27 18 views
6

Khi tôi nhập vào một giá trị chính xác (một số nguyên) nó là tốt. Nhưng khi tôi nhập vào một nhân vật, tôi nhận được một vòng lặp vô hạn. Tôi đã xem xét mọi mặt của mã này và không thể tìm thấy một vấn đề với nó. Tại sao chuyện này đang xảy ra? Tôi đang sử dụng g ++ 4.7 trên Windows.Tại sao mã này cung cấp cho tôi một vòng lặp vô hạn?

#include <iostream> 
#include <limits> 

int main() 
{ 
    int n; 
    while (!(std::cin >> n)) 
    { 
     std::cout << "Please try again.\n"; 
     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
     std::cin.clear(); 
    } 
} 

Input: x
Output:

enter image description here

+0

có một ký tự không thể in được như CR đi kèm với đầu vào khi bạn nhập hoặc không 'cin' lấy một ký tự? –

+0

Chỉ cần sử dụng 'scanf'. Cách dễ dàng hơn và rõ ràng hơn. –

+0

@Joker_vD Nhưng tôi nghĩ đây là C++ ... –

Trả lời

6

Đó là vì khôi phục lại hoạt động của bạn là theo thứ tự sai. Đầu tiên xóa lỗi sau đó xóa bộ đệm.

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

Cảm ơn. Tôi thậm chí không thể nói được! :) –

+1

Vấn đề là vì luồng ở trạng thái lỗi 'ignore' cũng sẽ bị lỗi trừ khi bạn xóa lỗi trước. – john

4

Bạn phải clear tình trạng lỗi đầu tiên, và sau đó ignore nội dung đệm unparsable. Nếu không, ignore sẽ không làm gì trên luồng không ở trạng thái tốt.

Bạn sẽ cần riêng để xử lý việc tiếp cận cuối luồng.

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