2015-04-04 75 views
0

我有這個代碼,我不能離開'elegir()'函數'while'循環。當輸入不好時,它會一直循環。我知道如果有其他條件,我可以完成它,但我想知道是否有可能使它與'while'一起運行。謝謝。功能檢查有效輸入,循環重複連續

Code here: 
#include "stdafx.h" 
#include <iostream> 

int const strsize = 100; 
struct bop { 
char fullname[strsize]; // real name 
char title[strsize]; // job title 
char bopname[strsize]; // secret BOP name 
int preference; //89 0 = fullname, 1 = title, 2 = bopname 
}; 
char elegir(); 
using namespace std; 
int main(){ 

bop miembros[3] = { 
{ 
"Luciano", 
"Doctor", 
"Zahyr", 
1 
}, 
{ 
"Sabrina", 
"Licenciada", 
"Mumu", 
2 
}, 
{ 
"Andres", 
"Verdulero", 
"Uruguayo", 
0 
} 
}; 

cout 
    << "Elija como desea que se muestren los miembros de la 'Orden':" <<  endl 
    << "a) Por nombre b) Por titulo\n" 
    "c) Por nombre secreto d) Por la eleccion del miembro\n"; 
char eleccion; 

eleccion = elegir(); 
    while (eleccion == 'a' || eleccion == 'b' || eleccion == 'c' || eleccion == 'd'){ 
     switch (eleccion){ 

     case 'a' : cout << "Mostrando miembros por 'Nombre':\n"; 
      for (int x=0;x<3;x++){ 
        cout << miembros[x].fullname << endl; 
      }; break; 
     case 'b' : cout << "Mostrando miembros por 'Titulo':\n"; 
      for (int x=0;x<3;x++){ 
        cout << miembros[x].title << endl; 
      }; break; 
     case 'c' : cout << "Mostrando miembros por 'Nombre secreto':\n"; 
      for (int x=0;x<3;x++){ 
        cout << miembros[x].bopname << endl; 
      }; break; 
     case 'd' : cout << "Mostrando miembros por preferencia del miembro: \n"; 
      for (int x=0;x<3;x++){ 
        if (miembros[x].preference == 0) 
         cout << miembros[x].fullname << endl; 
        else if (miembros[x].preference == 1) 
         cout << miembros[x].title << endl; 
        else 
         cout << miembros[x].bopname << endl; 
      }; break; 


     } 
     cin 
      >> eleccion; 
    } 



return 0; 
} 
char elegir(){ 
char e; 
cin 
    >> e; 
cin.clear('\n'); 
while (e != 'a' || e != 'b' || e != 'c' || e != 'd'){ 
    cout << "Eleccion incorrecta, elija nuevamente\n"; 
    cin 
     >> e; 
    cin.clear('\n'); 
} 
return e; 
} 
+0

請通過調試器中運行。這是學習的最佳方式。 – Jagannath 2015-04-04 01:16:40

+0

當輸入有效時,它永遠也卡在... – 2015-04-04 01:17:44

+0

該程序運行良好,除了現在我添加了功能來檢查輸入,它卡在循環中 – 2015-04-04 01:18:29

回答

0

隨着黑暗的答案,你的意見在詢問輸入前還需要cin.clear()

//main()  
cin.clear();  <-- include this line 
cin >> eleccion; 


//Similarly in elegir() 
char elegir(){ 
    char e; 
    cin >> e; 
    cin.clear('\n'); 
    while (e != 'a' && e != 'b' && e != 'c' && e != 'd'){ 
    cout << "Eleccion incorrecta, elija nuevamente\n"; 
    cin.clear(); <-- include this line 
    cin >> e; 
    cin.clear('\n'); 
    } 
return e; 
} 

包括cin.clear()清除可防止無限循環的錯誤標誌。這裏是一個教程,可以幫助您詳細瞭解,因爲它包含的例子

http://www.arachnoid.com/cpptutor/student1.html

+0

好吧,糾正,但現在它繼續循環顯示案件中的數據 – 2015-04-04 01:39:00

+0

檢查更新的答案。或者在cin >> eleccion之前在主函數中包含cin.clear()或者只是調用eleccion = elegir();我會做後者,因爲您已經有了要求用戶輸入的功能 – sam 2015-04-04 01:41:38

+0

greattttttttttt,thanksss – 2015-04-04 01:44:17

0

您的問題是在這條線

while (e != 'a' || e != 'b' || e != 'c' || e != 'd'){ 

會發生什麼,如果e是 'A'?

e != 'a' is false 
e != 'b' is true 
e != 'c' is true 
e != 'd' is true 

讓你同時測試結果爲

(false || true || true || true) 

,因爲你正在使用||這個計算結果爲

true 

解決方案 - 不使用||(或)這裏,使用&&(和)

+0

好的,我明白了,我的部分是愚蠢的,我做了,但現在它永遠顯示我的選擇(案例'x')!它運作良好=/ – 2015-04-04 01:24:29

+0

仍然循環在有效o無效輸入 – 2015-04-04 01:28:20