2012-02-15 78 views
0

我有一个C++程序,它从终端的输入,以及用于某种原因,这是生产的无限循环:C++无限循环与输入

double getSideLength() 
{ 
    cout << "Enter a side: " 
double side; 
cin >> side; cin.ignore(80, '\n'); 
while (side <= 0){ 
    cout << "Please enter a valid side. Try again: "; 
    cin >> side; cin.ignore(80, '\n'); 
} 
return side; 

这将产生输出:

Enter a side: invalid 
Please enter a valid side. Try again: 
Please enter a valid side. Try again: 
Please enter a valid side. Try again: 
    .... and so on. "invalid" is the only input the user made 
+1

你使用ignore子句是什么? – 2012-02-15 07:19:10

回答

2

如在operator>> documentation中所述,如果“获得的输入不能被解释为适当类型的元素”,则流将其失败。如果输入错误的号码,会发生这种情况所以你只需在下一次输入之前清除()cin。这里是代码:

double getSideLength() 
{ 
     double side; 
     cout << "Enter a side: "; 
     cin >> side; 
     if (!cin) 
      cin.clear(); 
     cin.ignore(80, '\n'); 
     while (side <= 0){ 
       cout << "Please enter a valid side. Try again: "; 
       cin >> side; 
       if (!cin) 
        cin.clear(); 
       cin.ignore(80, '\n'); 
     } 
     return side; 
} 
0
double getSideLength() 
{ 
    double side; 
getinput: 
    cout << "Enter a side: " 
    cin >> side; cin.ignore(80, '\n'); 
    if(side <= 0) 
    { 
     cout << "Please enter a valid side. Try again: " 
     goto getinput; 
    } 
    return side; 
} 

试试这个,我希望这对你有所帮助

+0

您不应该在代码中使用goto子句。 – Pochi 2012-02-15 07:30:12

+0

即时对不起为什么?即时通讯不是一个C++大师和编号喜欢知道原因。谢谢...... – 2012-02-15 07:32:44

+1

@Pochi:他们可能很难读,遵循和维护,但他们没有什么*错误*(即使是MS示例都有),编译器会将所有循环都转换为计算跳转。 – Necrolis 2012-02-15 07:34:04

1

这应该解决这个问题。使用!(cin >> side)将确保我们从cin获得正确的类型。

double getSideLength() 
{ 
    cout << "Enter a side: " << std::endl; 
    double side = -1; 
    while (! (cin >> side) and side <= 0) 
    { 
     cout << "Please enter a valid side. Try again: "; 
     cin.clear(); 
     cin.ignore(1000, '\n'); 
    } 

    return side; 
} 
0

似乎有很多错综复杂的与cin和在一般情况下,解释here,它可能是最好你用函数getline代替,然后使用atoi

另外,还讨论了here这个无限循环的问题。如果您想使用cin,则可以将输入转换为字符串变量,然后使用atoi将其转换为整数,如this post中所示。