我怎样才能让这个重复而不被卡在无效输入上?

Posted

技术标签:

【中文标题】我怎样才能让这个重复而不被卡在无效输入上?【英文标题】:How would I get this to repeat without getting stuck on invalid input? 【发布时间】:2014-09-17 17:41:09 【问题描述】:

快速提问。

如何让这段代码自行循环,以便它不断提出问题,但在给出非数字输入时仍允许执行不同的操作?

int main()

    int temp = 0;
    while (temp =1, 10)
    
        int amend_numb = -1;
                cout << "\nWhich amendment? "; 
                cin >> amend_numb;
            if (amend_numb == 1)
            
                cout << "a.\n";
            
            if (amend_numb == 2)
            
                cout << "b.\n";
            

我试图将它放入这个 while 语句中,但是如果我在 cin 中输入除整数以外的任何内容,那么它会执行一个不断重复 cout 语句的无限循环。有什么办法可以解决这个问题?

【问题讨论】:

我不太明白这个问题。你想让它永远重复,还是重复一定数量的循环 不是整数,你的意思是浮点数或字符串? @urnotsam 我希望这个问题永远重复,但是使用我现在拥有的代码,如果我不输入一个整数,那么它会进入一个无限循环,问这个问题没有休息什么的。 问题还不清楚,如果你想让它永远重复,那么它有什么问题会进入一个无限循环的提问 @Steve 我刚刚更新了代码。该程序将完全按照我的意愿运行,直到我输入除整数以外的任何内容。如果我输入“x”或“.”或“6.4”,那么它会不断地向问题发送垃圾邮件。 【参考方案1】:

while (temp =1, 10)

虽然该表达式在语法上是正确的,但它可能不会按照您的想法执行: 1.将temp分配给1。 2.忽略赋值返回的值(因为逗号操作) 3. 剩余表达式为 10,非零,所以循环继续。

一般的经验法则是使用for 循环进行已知数量的迭代:

for (temp = 1;   // assignment
     temp < 10;  // continuation expression
     ++temp)     // iterator incrementing

  // loop content
  

与用户交互时,您希望循环重复直到满足退出条件。

  unsigned int temp = 0;
  while (temp != 0)
  
    cout << "Enter amendment number, 0 to quit: ";
    cin >> temp;
    if (temp > 0)
    
      switch (temp)
      
        //...
      
    
  

有些人喜欢带有break 语句的forever 循环:

  unsigned int temp = 0;
  while (true)
  
    cout << "Enter amendment number, 0 to quit: ";
    cin >> temp;
    if (temp == 0)
    
      break; // terminate loop
    
    switch(temp)
    
      //...
    
  

【讨论】:

【参考方案2】:
while (true)

//your code
 

简单

然后对于你的非整数输入,如果你认为用户可能没有提供预期的输入,你真的应该做一个类型转换。因为 cin 会返回一个字符串,所以你应该使用字符串来进行 int 转换,如果你的编译器支持它,比如“stoi”,或者查找 c++ 字符串到 int,我很确定你会得到一堆答案。

编辑:如果用户可能输入任何不是数字的东西,那么你最好检查错误,在强制转换之间放置一个 try 和 catch 语句,如果失败则告诉用户输入无效。

【讨论】:

c++ try and catch for just int input 看起来很难解释,你能举个小例子吗?

以上是关于我怎样才能让这个重复而不被卡在无效输入上?的主要内容,如果未能解决你的问题,请参考以下文章

强制浏览器下载视频,而不是在 html 中打开 [重复]

跨线程操作无效[重复]

我怎样才能让我的程序等待输入,而不是在循环中

工具提示需要溢出:自动容器而不被切断[重复]

如果输入无效而不是继续输入无效,如何让程序重复?

错误 ITMS-90092:“此捆绑包无效...” [重复]