#include <iostream>
int main(int, char **)
{
using namespace std;
int days;
cout<<"How many days did you work this month? ";
cin>>days;
while(!(cin>>days) || (days<1) || (days>31)){
if(!(cin>>days)){
cout<<"Number of days should be... well, a number. Please re-enter: ";
cin.clear();
cin.ignore(100,'\n');
}
else if(days<1 || days>31){
cout<<"Number of days should be between 1 and 31. Please re-enter:";
cin>>days;
}
}
return 0;
}
這應該驗證用戶輸入:
第一個條件是在您請求 int 并且用戶輸入 char/string 時避免無限回圈。這部分作業得很好,它一直要求輸入,直到我輸入一個數字,然后繼續執行程式的下一部分(此處未顯示)。
天數應該在 1 到 30 之間。如果我輸入一個數字 - 范圍內或范圍外的任何數字 - 程式根本不會做任何事情。甚至不會顯示錯誤訊息。
如果我使用兩個單獨的回圈,一個用于驗證!(cin>>days)
,另一個用于(days<1) || (days>31)
. 我不知道我在這里做錯了什么。
uj5u.com熱心網友回復:
你的問題是在你做任何事情之前你正在閱讀 cin 輸入 3 次
int days;
cout<<"How many days did you work this month? ";
cin>>days; <<<<<==== 1
while(!(cin>>days) <<<<<<<=====2|| (days<1) || (days>31)){
if(!(cin>>days)){ <<<<<<=== 3
cout<<"Number of days should be... well, a number. Please re-enter: ";
cin.clear();
cin.ignore(100,'\n');
}
else if(days<1 || days>31){
cout<<"Number of days should be between 1 and 31. Please re-enter:";
cin>>days;
}
}
如果您想測驗是否有輸入錯誤,請執行!cin
IE
int days;
cout<<"How many days did you work this month? ";
cin>>days;
while(!(cin) || (days<1) || (days>31)){
if(!(cin)){
cout<<"Number of days should be... well, a number. Please re-enter: ";
cin.clear();
cin.ignore(100,'\n');
cin >> days;
}
else if(days<1 || days>31){
cout<<"Number of days should be between 1 and 31. Please re-enter:";
cin>>days;
}
}
uj5u.com熱心網友回復:
您正在使用三個順序呼叫cin>>days
cin>>days;
while(!(cin>>days) || (days<1) || (days>31)){
if(!(cin>>days)){
//...
或者
while(!(cin>>days) || (days<1) || (days>31)){
if(!(cin>>days)){
//...
}
else if(days<1 || days>31){
//...
cin>>days;
}
}
那沒有任何意義。
代碼可以如下所示,例如:
int days;
bool failure;
cout<<"How many days did you work this month? ";
while( ( failure = !(cin>>days) ) || (days<1) || (days>31)){
if( failure ){
cout<<"Number of days should be... well, a number. Please re-enter: ";
cin.clear();
cin.ignore(100,'\n');
}
else if(days<1 || days>31){
cout<<"Number of days should be between 1 and 31. Please re-enter:";
}
}
uj5u.com熱心網友回復:
你打電話的cin >> days
次數太多了。
您正在提示用戶輸入,然后在days
進入回圈之前讀入,但您完全忽略了用戶的初始輸入。
然后,一旦你進入回圈,你在做任何其他事情之前days
再次閱讀。但是您還沒有提示用戶進行其他輸入。最終,希望他們會發現您的程式正在等待另一個輸入,并會輸入一些內容。
但是,如果該輸入無法讀取數字,或者數字超出范圍,那么您將提示用戶并days
再次讀取,然后跳轉到下一個回圈迭代,然后重新開始錯誤模式,等待額外的輸入而不提示用戶輸入任何輸入。
days
每次回圈迭代您應該只閱讀1 次。
其他人建議如何將輸入驗證歸類到您現有的回圈結構中。相反,我會建議一個稍微不同的回圈結構,它應該使代碼更容易理解和遵循:
#include <iostream>
#include <limits>
int main()
{
using namespace std;
int days;
cout << "How many days did you work this month? ";
do {
if (!(cin >> days)) {
cout << "Number of days should be... well, a number. Please re-enter: ";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
else if ((days < 1) || (days > 31)) {
cout << "Number of days should be between 1 and 31. Please re-enter:";
}
else {
break;
}
}
while (true);
cout << "Thank you for working " << days << "day(s)!";
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/491244.html