2010-07-18 22 views
15

Làm cách nào để kiểm tra xem đầu vào có thực sự là gấp đôi không?làm cách nào để xác thực tính năng nhập của người dùng dưới dạng gấp đôi trong C++?

double x; 

while (1) { 
    cout << '>'; 
    if (cin >> x) { 
     // valid number 
     break; 
    } else { 
     // not a valid number 
     cout << "Invalid Input! Please input a numerical value." << endl; 
    } 
} 
//do other stuff... 

Đoạn mã trên vô hạn kết quả đầu ra báo cáo kết quả Invalid Input!, vì vậy nó không khiến cho các đầu vào khác. Tôi muốn nhắc nhở cho đầu vào, kiểm tra xem nó có hợp pháp không ... nếu nó là một đôi, đi về ... nếu nó không phải là một đôi, nhắc lại.

Bất kỳ ý tưởng nào?

+0

Hãy chắc chắn để xem xét các hướng dẫn định dạng thời gian tiếp theo bạn thực hiện một bưu điện. Cảm ơn. – strager

+0

ý của bạn là gì? những gì là sai với định dạng? – Hristo

+0

Tôi đã chỉnh sửa bài đăng của bạn, nhưng trước khi chỉnh sửa mã không được định dạng. Nhấp vào "đã chỉnh sửa N phút trước" để xem bài đăng gốc. – strager

Trả lời

14

Hãy thử điều này:

while (1) { 
    if (cin >> x) { 
     // valid number 
     break; 
    } else { 
     // not a valid number 
     cout << "Invalid Input! Please input a numerical value." << endl; 
     cin.clear(); 
     while (cin.get() != '\n') ; // empty loop 
    } 
} 

này về cơ bản xóa tình trạng lỗi, sau đó đọc và loại bỏ tất cả những gì đã được nhập trên dòng trước đó.

+0

là bên trong vòng lặp 'while (1)'? – Hristo

+0

Có, bên trong vòng lặp hiện tại của bạn. Tôi vừa sao chép phần bên trong. – casablanca

+0

Ok hoạt động. Bạn có thể giải thích logic đằng sau vòng lặp trống không? Chính xác những gì đang diễn ra trong đó? 'Get()' làm gì? – Hristo

-3

Tôi sẽ sử dụng scanf thay vì cin.

Chức năng scanf sẽ trả lại số kết quả phù hợp từ chuỗi mục tiêu. Để đảm bảo một đôi hợp lệ đã được phân tích cú pháp, chắc chắn giá trị trả về của scanf là 1.

Edit:
Changed fscanf để scanf.

+0

Tôi muốn đọc từ dòng lệnh ... không phải là 'fscanf' để đọc từ một' FILE'? – Hristo

+0

Câu hỏi đặt ra là làm thế nào để làm điều đó bằng cách sử dụng 'cin'. – casablanca

+0

'scanf' sẽ cung cấp cùng chức năng ngoại trừ sẽ được đọc từ' stdin' thay vì đối tượng tệp tùy ý. – advait

1

failbit sẽ được đặt sau khi sử dụng toán tử trích xuất nếu có lỗi phân tích cú pháp, có một vài hàm kiểm tra đơn giản goodfail bạn có thể kiểm tra. Chúng hoàn toàn ngược lại với nhau bởi vì chúng xử lý một cách khác nhau, nhưng đó không phải là một vấn đề trong ví dụ này.

Sau đó, bạn phải xóa failbit trước khi thử lại.

Như casablanca nói, bạn cũng phải loại bỏ dữ liệu không phải là số còn lại trong bộ đệm đầu vào.

Vì vậy:

double x; 

while (1) { 
    cout << '>'; 
    cin >> x; 
    if (cin.good()) 
     // valid number 
     break; 
    } else { 
     // not a valid number 
     cout << "Invalid Input! Please input a numerical value." << endl; 
     cin.clear(); 
     cin.ignore(100000, '\n'); 
    } 
} 
//do other stuff... 
+0

điều này vẫn gây ra vòng lặp vô hạn để in 'Invalid Input!' ... của nó không nhắc cho đầu vào khác. – Hristo

+0

'cin.ignore()' làm gì? – Hristo

+0

Tương tự như vòng lặp casablanca, nó ném đi tất cả các ký tự lên đến và bao gồm cả dòng mới để loại bỏ bất kỳ dữ liệu không phải số nào gây ra lần trích xuất đầu tiên thất bại. –

0

Một cách là kiểm tra tính bình đẳng số động.

double x; 

while (1) { 
    cout << '>'; 
    cin >> x; 
    if (x != int(x)) { 
     // valid number 
     break; 
    } else { 
     // not a valid number 
     cout << "Invalid Input! Please input a numerical value." << endl; 
    } 
} 
+0

cách này kiểm tra loại 'double'? – Hristo

+0

Điều này chỉ kiểm tra xem đầu vào có phần phân đoạn không, điều này có lẽ không phải là ý nghĩa của câu hỏi. –

+0

Vâng, hầu hết chúng ta đều biết Hristo có ý gì nhưng câu trả lời này giải quyết được câu hỏi mà anh ta hỏi: "Làm sao tôi kiểm tra xem đầu vào có thực sự là gấp đôi không?" Giải thích rằng, "Tôi cho rằng tôi đang nhận được con số, làm cách nào để đảm bảo chúng không phải là số nguyên?" làm cho câu trả lời này hoàn toàn hữu ích. Không cần downvote, imo. – chaosTechnician

0
#include <iostream> 
#include <string> 

bool askForDouble(char const *question, double &ret) 
{ 
     using namespace std; 
     while(true) 
     { 
       cout << question << flush; 
       cin >> ret; 
       if(cin.good()) 
       { 
         return true; 
       } 
       if(cin.eof()) 
       { 
         return false; 
       } 
       // (cin.fail() || cin.bad()) is true here 
       cin.clear(); // clear state flags 
       string dummy; 
       cin >> dummy; // discard a word 
     } 
} 

int main() 
{ 
     double x; 
     if(askForDouble("Give me a floating point number! ",x)) 
     { 
       std::cout << "The double of it is: " << (x*2) << std::endl; 
     } else 
     { 
       std::cerr << "END OF INPUT" << std::endl; 
     } 
     return 0; 
} 
+1

Xác thực đầu vào phải là một công việc dễ dàng hơn để thực hiện. Nó làm cho nó rất khó để dạy người mới và giúp họ tận hưởng những gì họ đang làm. Tôi muốn xem một hướng dẫn chống đạn và hữu ích trên cin và cout cho người mới. – Notinlist

0
bool is_double(double val) 
{ 
bool answer; 
double chk; 
int double_equl = 0;  
double strdouble = 0.0; 
strdouble = val;   
double_equl = (int)val; 
chk = double_equl/strdouble; 
if (chk == 1.00) 
{ 
answer = false; // val is integer 
return answer; 
} else { 
answer = true; // val is double 
return answer; 
} 
} 
Các vấn đề liên quan