簡體   English   中英

while循環不會以c ++結尾

[英]while-loop doesn't end in c++

因此,這只是我較大的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;
}

當我運行此部分時,當我被要求輸入inputWeekDay時,例如輸入“ g”,它告訴我“您的輸入不正確。\\ n您現在將被踢出該程序。” 錯誤,並再次詢問我,這應該是怎么回事。 但是在那之后,當我輸入例如“ m”時,它不等於weekDay,也不是while循環中的條件之一,它使我陷入了while循環中,並且再次出現錯誤。 當我輸入正確的“ weekDay”時也是如此,它仍然會給我錯誤消息。

有什么想法會導致這種情況嗎? 先感謝您。

您的條件是比較inputWeekDay是否等於許多字符的按位與。

大概您想比較它是否等於任何字符。

您可以使用以下條件來做到這一點:

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

但這很快就變老了。 另一種方法是在do-while循環中使用switch語句。

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 );  

您的時間必須是這樣的:

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

這樣您就可以真正檢查inputWeekDay與所有給定值是否確實不同。

編輯:您可以使其變得更容易,如下所示:

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

您正在對所有字符進行按位與運算,當您想要的是邏輯與時,還必須分別列出每個條件。 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'){

我認為問題在於按位與運算符(&)。 您應該使用邏輯與(&&)。

由於它們是char ,因此您可以避免循環並聲明:

const char *daysInTheWeek = "mtwpfsz";

然后:

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

問題是您不正確地寫了條件。 運算符&是按位與運算符。

要檢查輸入的值是否在數組的值中,最好使用標准算法std::find

例如

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

這個循環也可以寫成

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

或者,您可以將array daysInTheWeek定義為

char daysInTheWeek[] = { "mtwpfsz" };

並使用標准的C函數strchr例如

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM