2014-09-12 98 views
-1

所以,这是我更大的C++程序中的一小段代码。所有相关部分都包含在内。while循环不会以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; 
} 

当我运行这个部分,我输入例如“G”当我问inputWeekDay,它给了我“你的输入是不正确的。\ n您现在将被踢出这个节目的。 “错误,并再次问我,这是应该发生的事情。但之后,当我键入例如'm',这不等于weekDay,但不是while循环中的条件之一,它使我处于while循环中,并再次出现错误。当我输入正确的'weekDay'时,情况也是如此,它仍然会给我提供错误信息。

任何想法可能导致这种情况?先谢谢你。

+3

你完全滥用逻辑和位运算符。 – SLaks 2014-09-12 21:32:48

+0

你在做什么是一个AND的7个字符,并将其与inputWeekDay进行比较,而这几乎不等于inputWeekDay – 2014-09-12 21:32:50

+0

您在while循环检查中执行按位&运算符... – Arpit 2014-09-12 21:33:30

回答

3

您的条件是比较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); 
+0

最后一次编辑使答案非常混乱。 – Almo 2014-09-12 21:36:56

+0

@Almo - 我觉得你让我陷入了中间编辑。 – 2014-09-12 21:38:42

+0

那么,检查你的前四行。前两个是第二个两个重复的,AND被更改为OR。无论如何,这就是我所看到的。 :( – Almo 2014-09-12 21:40:17

2

你同时必须是这样的:

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

所以,你真的检查inputWeekDay是所有给定值确实不同。

编辑:您可以使它更容易如下:

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

+ +1为更优雅的解决方案比长条件或长长的箱子标签清单! – 2014-09-12 21:40:36

+0

谢谢:)其实我早就知道了:) – 2014-09-12 21:40:59

+0

谢谢,一定会看看这个:) – 2014-09-12 21:46:11

1

你正在做的所有字符的按位与运算时,你想要的是一个逻辑与,你也必须列出每个条件分别。 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'){ 
1

我认为问题是按位与运算符(&)。您应该使用逻辑和(& &)。

1

因为他们是char S,你能抽出自己的循环,并声明:

const char *daysInTheWeek = "mtwpfsz"; 

则:

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

的问题是,你写错了条件。运算符&是按位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) 
{ 
    //... 
}