2010-01-16 26 views
13

Tôi đang ở lớp OOP thứ hai, và lớp đầu tiên của tôi được dạy bằng C#, vì vậy tôi mới dùng C++ và hiện tại tôi đang thực hành xác thực đầu vào bằng cin. Vì vậy, đây là câu hỏi của tôi:Vòng xác thực đầu vào tốt bằng cin - C++

Vòng lặp này có phải là cách tốt để xác thực đầu vào không? Hoặc có cách nào phổ biến hơn/được chấp nhận để làm điều đó?

Cảm ơn!

Code:

int taxableIncome; 
int error; 

// input validation loop 
do 
{ 
    error = 0; 
    cout << "Please enter in your taxable income: "; 
    cin >> taxableIncome; 
    if (cin.fail()) 
    { 
     cout << "Please enter a valid integer" << endl; 
     error = 1; 
     cin.clear(); 
     cin.ignore(80, '\n'); 
    } 
}while(error == 1); 

Trả lời

23

Tôi không phải là người hâm mộ lớn về việc bật ngoại lệ cho iostream. Lỗi I/O không đủ đặc biệt, trong các lỗi đó thường rất có thể xảy ra. Tôi chỉ thích sử dụng ngoại lệ cho các điều kiện lỗi ít thường xuyên hơn.

Mã không phải là xấu, nhưng bỏ qua 80 ký tự là một chút tùy ý, và biến lỗi là không cần thiết nếu bạn fiddle với vòng lặp (và nên là bool nếu bạn giữ nó). Bạn có thể đặt đọc từ số cin trực tiếp vào một số if, có lẽ là nhiều hơn một thành ngữ Perl.

Dưới đây là quan điểm của tôi:

int taxableIncome; 

for (;;) { 
    cout << "Please enter in your taxable income: "; 
    if (cin >> taxableIncome) { 
     break; 
    } else { 
     cout << "Please enter a valid integer" << endl; 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
    } 
} 

Ngoài chỉ bỏ qua 80 ký tự, đây là những chỉ quibbles nhỏ, và có nhiều vấn đề của phong cách ưa thích.

+0

Xin cảm ơn, điều này phù hợp hơn với những gì tôi đang tìm kiếm. Nhiều đánh giá cao. Một câu hỏi là, điều kiện vòng lặp (;;) là gì? Đừng hiểu điều đó. – Alex

+2

@Alex - 'foo (;;)' nghĩa là vòng lặp mãi mãi, giống như 'while (1)'. Nếu bạn không muốn vòng lặp của bạn thực sự lặp mãi mãi, bạn cần một 'break' ở đâu đó bên trong để chấm dứt vòng lặp. –

+0

Tôi thường có trong khi (! Eof (stdin)) trong trường hợp như vậy, để tránh mã phát điên nếu đầu vào bị mất ... hoặc sẽ ném một ngoại lệ ở đây? – PypeBros

3

Có thể bạn không xem xét try/catch, chỉ để giúp bạn quen với khái niệm về xử lý ngoại lệ?

Nếu không, tại sao không sử dụng boolean thay vì 0 và 1? Nhận được vào các thói quen sử dụng các biến của các loại chính xác (và các loại tạo nơi cần thiết)

Cin.fail() cũng được thảo luận tại http://www.cplusplus.com/forum/beginner/2957/

Trong thực tế, ở nhiều nơi ...

http://www.google.com.sg/#hl=en&source=hp&q=c%2B%2B+tutorial&btnG=Google+Search&meta=&aq=f&oq=c%2B%2B+tutorial

bạn có thể nghiên cứu một số trong số đó và cố gắng thực hiện theo các giải thích về lý do tại sao mọi thứ phải được thực hiện theo một cách nhất định.

Nhưng, sớm hay muộn, bạn phải hiểu ngoại lệ ...

2

Một phân minh nhỏ là biến lỗi helper là hoàn toàn không cần thiết và không cần thiết:

do 
{ 
    cin.clear(); 
    cout << "Please enter in your taxable income: "; 
    cin >> taxableIncome; 
    if (cin.fail()) 
    { 
     cout << "Please enter a valid integer" << endl; 
     cin.ignore(80, '\n'); 
    } 
}while(cin.fail()); 
4
int taxableIncome; 
string strInput = ""; 
cout << "Please enter in your taxable income:\n"; 

while (true) 
{ 
    getline(cin, strInput); 

    // This code converts from string to number safely. 
    stringstream myStream(strInput); 
    if ((myStream >> taxableIncome)) 
     break; 
    cout << "Invalid input, please try again" << endl; 
} 

Vì vậy, bạn thấy tôi sử dụng chuỗi cho đầu vào và sau đó chuyển đổi đó để một số nguyên. Bằng cách này, ai đó có thể gõ enter, 'mickey mouse' hoặc bất cứ điều gì và nó vẫn sẽ trả lời.
Ngoài ra #include <string><sstream>

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