while-loop不以c ++结尾

时间:2014-09-12 21:29:24

标签: c++ while-loop

所以,这是我更大的c ++程序中的一小段代码。所有相关部分都包括在内。

char weekDay;
char inputWeekDay;
char daysInTheWeek[7] = { 'm','t','w','p','f','s','z' } ;
int days = 1723;

weekDay = daysInTheWeek[days%7] ;
cout << weekDay << endl ;

cin >> inputWeekDay ;

while (inputWeekDay != ('m'&'t'&'w'&'p'&'f'&'s'&'z')) {
    cout << "Your input isn't one of the above.\nTry again." << endl ;
    cin >> inputWeekDay ;
}
if (inputWeekDay == weekDay) {
    cout << "Your input is correct." ;
} 
else {
    cout << "Your input isn't correct.\nYou will now get kicked out of this program." ;
    return 1;
}

当我运行这部分时,当我被要求输入inputWeay时输入例如'g',它会给我'你的输入不对。\ n你现在将被踢出这个程序。'错误并再次问我,这应该是什么。但在那之后,当我键入例如'm',它不等于weekDay但不是while循环中的条件之一时,它使我保持在while循环中并且我再次得到错误。当我输入正确的'weekDay'时,它仍然会给我错误信息。

任何可能导致此问题的想法?提前谢谢。

6 个答案:

答案 0 :(得分:3)

您的条件是比较inputWeekDay是否等于许多字符的按位AND。

据推测,你想要比较它是否等于任何字符。

你可以用这样的条件来做到这一点:

while ( inputWeekDay != 'm'
    && inputWeekDay != 't'
    && inputWeekDay != 'w'
    ...

但这很快就会变老。另一种方法是在switch循环中使用do-while语句。

bool isValid = false;
do {
    switch ( inputWeekDay ) {
       case 'm':
       case 't':
         ...
         isValid = true;
         break;

       default:
         isValid = false;
         break;
   }
   if ( ! isValid ) {
       cout << "Your input isn't one of the above.\nTry again." << endl ;
       cin >> inputWeekDay ;
   } 
} while ( ! isValid );  

答案 1 :(得分:2)

你的时间必须是:

while(inputWeekDay != 'm' && inputWeekDay != 't' && ...)

因此,您确实在检查inputWeekDay是否与所有给定值完全不同。

编辑:您可以按照以下方式轻松完成:

std::string weekDay("mtwpfsz");
...
while (str.find(inputWeekDay)!=std::string::npos)
{
    ...
}

答案 2 :(得分:1)

您正在对所有字符执行按位AND操作,当您想要的是逻辑AND时,您还必须单独列出每个条件。 C ++不支持你在while语句中使用的样式。

while (inputWeekDay != ('m'&'t'&'w'&'p'&'f'&'s'&'z')) {

应该成为

while ( inputWeekDay != 'm'
        && inputWeekDay != 't'
        && inputWeekDay != 'w'
        && inputWeekDay != 'p'
        && inputWeekDay != 'f'
        && inputWeekDay != 's'
        && inputWeekDay != 'z'){

答案 3 :(得分:1)

我认为问题在于按位运算符(&amp;)。你应该使用逻辑和(&amp;&amp;)。

答案 4 :(得分:1)

由于他们是char,你可以省去循环并宣布:

const char *daysInTheWeek = "mtwpfsz";

然后:

while (strchr(daysInTheWeek, inputWeekDay) == NULL) {
  // ...
}

答案 5 :(得分:0)

问题是你写错了条件。运营商&amp;是按位AND运算符。

要检查输入的值是否为数组值,最好使用标准算法std::find

例如

while ( std::find( daysInTheWeek, daysInTheWeek + 7, inputWeekDay ) == daysInTheWeek + 7 )
{
   //...
}

这个循环也可以写成

while ( std::find( std::begin( daysInTheWeek ), std:;end( daysInTheWeek ), inputWeekDay ) == std::end( daysInTheWeek ) )
{
   //...
}

或者您可以将数组daysInTheWeek定义为

char daysInTheWeek[] = { "mtwpfsz" };

并使用标准C函数strchr 例如

while ( std::strchr( daysInTheWeek, inputWeekDay ) == NULL )
{
   //...
}