2013-06-05 40 views
5

Tôi đã cố gắng nhắc người dùng nhập liệu và thực hiện xác thực. Ví dụ: chương trình của tôi phải có 3 đầu vào của người dùng. Khi nó truy cập không phải số nguyên, nó sẽ in thông báo lỗi và nhắc nhập lại. Sau đây là cách chương trình của tôi sẽ trông giống như khi chạy:Xác nhận số nguyên cho đầu vào

Nhập số: a

sai đầu vào

Nhập số: 1

Nhập số: b

Wrong đầu vào

Nhập số: 2

Nhập số: 3

số nhập không 1,2,3

Và đây là mã của tôi:

double read_input() 
{ 
    double input; 
    bool valid = true; 
    cout << "Enter number: " ; 
    while(valid){ 
     cin >> input; 
     if(cin.fail()) 
     { 
      valid = false; 
     } 
    } 
    return input; 
} 

phương pháp chính của tôi:

int main() 
{ 
double x = read_input(); 
double y = read_input(); 
double z = read_input(); 
} 

Khi tôi đầu vào đầu tiên không phải là số nguyên, chương trình chỉ thoát khỏi chính nó. Nó không yêu cầu nhắc lại. Làm thế nào tôi có thể sửa nó? Hoặc tôi có nghĩa vụ phải sử dụng một vòng lặp while do tôi yêu cầu đầu vào của người dùng.

Xin cảm ơn trước.

+0

chúng tôi phải xem thêm mã .. bạn đã kiểm tra nó bằng trình gỡ rối chưa? có thể là một sự cố ... –

+0

bên trong phương thức chính tôi chỉ viết double x = read_input(); double y = read_input(); double z = read_input(); Tôi đang làm sai cách? –

Trả lời

7

Khi đọc thất bại, bạn thiết lập valid-false, vì vậy điều kiện trong while vòng lặp là false và chương trình trả input (mà không được khởi tạo, bằng cách này).

Bạn cũng có để trống bộ đệm trước khi sử dụng nó một lần nữa, một cái gì đó như:

#include <iostream> 
#include <limits> 

using namespace std; 

double read_input() 
{ 
    double input = -1; 
    bool valid= false; 
    do 
    { 
     cout << "Enter a number: " << flush; 
     cin >> input; 
     if (cin.good()) 
     { 
      //everything went well, we'll get out of the loop and return the value 
      valid = true; 
     } 
     else 
     { 
      //something went wrong, we reset the buffer's state to good 
      cin.clear(); 
      //and empty it 
      cin.ignore(numeric_limits<streamsize>::max(),'\n'); 
      cout << "Invalid input; please re-enter." << endl; 
     } 
    } while (!valid); 

    return (input); 
} 
+0

Khi tôi đặt một cout trong tuyên bố khác và tôi gõ vào không nguyên, bản thân thông báo lỗi chỉ giữ vòng lặp. –

+0

Tôi không thể kiểm tra mã, nhưng Ideone có cùng đầu ra, hãy để tôi kiểm tra lý do. – Djon

+0

@Carol Nó hoạt động ngay bây giờ, tôi đoán đó là thứ tự giữa 'clear' và' ignore': http://ideone.com/fl4IMK – Djon

0

Câu hỏi của bạn đã nhận được bản thân mình vào các vấn đề khác như thanh toán bù trừ các cin trên Fail() -

double read_input() 
{ 
double input; 
int count = 0; 
bool valid = true; 
while(count != 3) { 
    cout << "Enter number: " ; 
    //cin.ignore(); 
    cin >> input; 
    if(cin.fail()) 
    { 
     cout << "Wrong Input" <<endl; 
     cin.clear(); 
     cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    } 
    else 
      count++; 
} 
return input; 
} 
0

Sự cố ở trong tình trạng thời gian

bool valid = true; 
while(valid){ 

Bạn lặp lại cho đến khi bạn nhận được đầu vào không hợp lệ, abs này olutly không phải những gì bạn muốn! điều kiện vòng lặp nên như thế này

bool valid = false; 
while(! valid){ // repeat as long as the input is not valid 

Dưới đây là một phiên bản sửa đổi của bạn read_double

double read_input() 
{ 
    double input; 
    bool valid = false; 
    while(! valid){ // repeat as long as the input is not valid 
     cout << "Enter number: " ; 
     cin >> input; 
     if(cin.fail()) 
     { 
      cout << "Wrong input" << endl; 

      // clear error flags 
      cin.clear(); 
      // Wrong input remains on the stream, so you need to get rid of it 
      cin.ignore(INT_MAX, '\n'); 
     } 
     else 
     { 
      valid = true; 
     } 
    } 
    return input; 
} 

Và trong chính bạn, bạn cần phải hỏi cho đôi như may như bạn muốn, ví dụ

int main() 
{ 
    double d1 = read_input(); 
    double d2 = read_input(); 
    double d3 = read_input(); 

    cout << "Numbers entered are: " << d1 << ", " << d2 << ", " << d3 << endl; 

    return 0; 
} 

Bạn cũng có thể muốn có một vòng lặp nơi bạn gọi read_double() và lưu các giá trị trả về trong một mảng.

+0

Ok cảm ơn rất nhiều. Tôi đã sử dụng cin.clear() và getline trong câu lệnh khác và nó hoạt động ngay bây giờ –

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