做while循环不能正常工作

时间:2016-05-14 05:52:20

标签: c++

我希望用户输入的日期早于或等于2016年5月30日且不低于2016年1月1日。如果输入无效,则应返回并再次向用户提问。问题是<div class="wrapper" style="background-color:lightgrey;"> <div class="container"> <h1 id="titleHead">Projects</h1> <div class = "ulContainer"> <ul> <li> <div class ="circle1"> <div id ="btn1"></div> </div> </li> <li> <div class ="circle2"> <div id ="btn2"></div> </div> </li> </ul> </div> </div> </div> 循环没有循环,它在输入无效后停止。这是代码:

do...while

1 个答案:

答案 0 :(得分:2)

while(symbol!='/'&&!(month<=05)&&!(day<=31)&&year!=2016);

必须是

while(symbol!='/' || !(month<=05) || !(day<=31) || year!=2016);

或@Barmar建议

while(symbol!='/' || (month>05) || (day>31) || year!=2016);

由于&&,您的原始表达式要求所有4都为真。使用||的表达式只需要其中一个为真。

另请注意,由于您内部已有if,因此您不需要检查。

所以你可以这么做:

while (true) {
    cout<<"Enter date: ";

    cin>>month>>symbol>>day>>symbol>>year;

    // clear cin
    cin.clear();
    cin.ignore(10000,'\n');  // Or better:
                             // std::numeric_limits<std::streamsize>::max()
                             // instead of just 10000 

    if(symbol=='/' && month<=05 && day<=31 && year==2016){
        // code for handling valid date here

        // This will end the while loop
        break;  
    }
    else{
        cout<<"You have entered an invalid input.\n"<<endl;
    }
};

无关:也请注意此行

cin>>month>>symbol>>day>>symbol>>year;
            ^^           ^^

这里你读了symbol两次,即第二个值只会覆盖第一个值。相反,你需要

cin >> month >> symbol1 >> day >> symbol2 >> year;
                      ^                 ^

并且因此会相应地更改其余代码。

  

更新

可以在此处测试代码https://ideone.com/KvCy1e

使用输入

dem/dem/dem
1/1/2016

输出

Enter date: You have entered an invalid input.

Enter date: 1/1/2016 is Friday.
  

更新2

正如@Barmar在评论中所注意到的那样,你应该在循环之前将变量初始化为某个无效日期。

int month = 13;
int day = 32;
int year = 0;
char symbol = 'x';

顺便说一下:由于你使用ints,你应该检查负值。