2014-09-12 95 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) 
{ 
    //... 
}