用 cin 检查用户整数输入会产生无限循环

Posted

技术标签:

【中文标题】用 cin 检查用户整数输入会产生无限循环【英文标题】:checking for user integer input with cin gives infinite loop 【发布时间】:2013-03-02 22:42:19 【问题描述】:

如果用户没有在输入提示中输入任何内容,并且他们输入的内容为零或更少,我将尝试打印错误消息。

void checkScoreInputed(int* qaltScores, int i)
    while(true)
        // cin.clear(); here?
        if ((cin >> qaltScores[i]) && (qaltScores > 0))
            // also tried placing cin.clear() here. 
            break; else // else is optional
        cout << "Please supply a positive number for the score: ";
    

我尝试在 if 语句之前和之后放置 cin.ignore() 和 cin.clear(),但在用户输入非整数值后,我仍然得到cout &lt;&lt; "Please supply...." 的无限循环,例如一个人物。我该如何解决这个问题?

【问题讨论】:

问题是,如果需要,我不确定应该将 clear() 放在哪里。 您需要在输入进入错误状态后调用它们。在您的代码中,输出在逻辑上是最正确的。 @chris 谢谢克里斯,你的评论应该是一个答案,帮助并使它工作! 答案提供的时间和我差不多 :) 我想要非常简短地解释你为什么把它放在那里。 【参考方案1】:

你忘记了

中的[i]
if ((cin >> qaltScores[i]) && (qaltScores[i] > 0))
                                         ^^^

没有它,您将检查指针的值,而不是您刚刚读取的数字。

您还需要致电cin.clear()cin.ignore()

void checkScoreInputed(int* qaltScores, int i) 
    while(true) 
        if ((cin >> qaltScores[i]) && (qaltScores[i] > 0))
            break;
        
        cout << "Please supply a positive number for the score: ";
        cin.clear();
        cin.ignore(10000,'\n');
    

见Why would we call cin.clear() and cin.ignore() after reading input?

【讨论】:

哦,哎呀。谢谢。但这并没有解决我的问题。在添加 qaltScores[i] > 0 的最后一个条件之前,我也遇到了无限循环问题。 我应该把它们放在 if 语句的外面还是里面? 还添加了 cin.ignore(1000, '\n') 部分,结果非常重要。

以上是关于用 cin 检查用户整数输入会产生无限循环的主要内容,如果未能解决你的问题,请参考以下文章

无限循环计算阶乘问题

使用 cin::fail() 从标准输入进行无限循环读取

如果其他条件产生无限循环,则继续语句[关闭]

带有选项的菜单列表

为啥这个回调会产生无限循环

我的 cin 在 while 循环中被忽略