2013-09-02 96 views
5

Mới đối với C++. Có vấn đề lặp chính xác trong khi xử lý lỗi. Tôi đang cố gắng kiểm tra xem liệu đầu vào của người dùng có phải là số nguyên hay không và là số dương.C++ Kiểm tra số nguyên.

do{ 
    cout << "Please enter an integer."; 
    cin >> n; 

    if (cin.good()) 
    { 
     if (n < 0) {cout << "Negative.";} 
     else {cout << "Positive.";} 
    } 
    else 
    { 
     cout << "Not an integer."; 
     cin.clear(); 
     cin.ignore(); 
    } 
}while (!cin.good() || n < 0); 

cout << "\ndone."; 

Khi không nhập số nguyên, ngắt vòng lặp. Tôi cảm thấy như tôi hiểu sai việc sử dụng vốn có của cin.clear()cin.ignore() và trạng thái của cin trong vòng lặp này. Nếu tôi xóa cin.ignore(), vòng lặp sẽ trở thành vô hạn. Tại sao điều này? Tôi có thể làm gì để biến nó thành một vòng lặp hoạt động thanh lịch? Cảm ơn bạn.

+1

Sử dụng một trình gỡ lỗi. –

Trả lời

5

Trong chi nhánh không phải số nguyên, bạn đang gọi thêm cin các phương thức để cin.good() được đặt lại thành true.

Bạn có thể thay đổi mã của bạn để một cái gì đó như thế này:

while(1) { // <<< loop "forever" 
    cout << "Please enter an integer."; 
    cin >> n; 

    if (cin.good()) 
    { 
     if (n < 0) {cout << "Negative.";} 
     else { cout << "Positive."; break; } 
    }       // ^^^^^ break out of loop only if valid +ve integer 
    else 
    { 
     cout << "Not an integer."; 
     cin.clear(); 
     cin.ignore(INT_MAX, '\n'); // NB: preferred method for flushing cin 
    } 
} 

cout << "\ndone."; 

hoặc bạn có thể đơn giản hóa nó hơn nữa như thế này:

while (!(cin >> n) || n < 0) // <<< note use of "short circuit" logical operation here 
{ 
    cout << "Bad input - try again: "; 
    cin.clear(); 
    cin.ignore(INT_MAX, '\n'); // NB: preferred method for flushing cin 
} 

cout << "\ndone."; 
+1

Điều này hoạt động tuyệt vời, cảm ơn bạn! Tôi thậm chí không nghĩ rằng sự lựa chọn của tôi về vòng lặp đã giữ tôi trở lại. Tôi đánh giá cao sự giúp đỡ và lời giải thích. – xavi

+0

Không phải phiên bản thứ hai sẽ dẫn đến vòng lặp vô tận khi người dùng đã nhập rác (ví dụ: "abc")? Bạn cần trích xuất (hoặc bỏ qua) thư rác trước khi lặp (nhưng sau 'clear()'). –

+0

@James: tốt bắt - cảm ơn - Tôi đã sửa nó ngay bây giờ (và thực sự đã thử nghiệm nó!). –

3
int n; 

while (!(cin >> n)||n<0)//as long as the number entered is not an int or negative, keep checking 
{ 
cout << "Wrong input. Please, try again: "; 
cin.clear();//clear input buffer 

} 
//only gets executed when you've broken out of the while loop, so n must be an int 
cout << "Positive."; 

cout << "\ndone.";//finished! 

Nên làm những gì bạn muốn.

+0

không giải thích những gì đã xảy ra ... –

+0

@NoIdeaForName điểm, tôi sẽ bình luận trong giải thích – imulsion

+0

bây giờ mà tôi kiểm tra nó, nó thậm chí không làm những gì ông yêu cầu để làm. nếu đầu vào là tốt, bạn nên để lại chỉ khi nó tiêu cực ... –