Cin不会暂停(忽略)用户输入

时间:2017-03-02 14:07:52

标签: c++ visual-studio

运行代码后,cin函数中的FtoC()将被忽略,而ctemp的值默认为0。我已经使用其他代码(不同的循环)使代码运行,但我真的想了解这个错误的机制,并采用这种方式来实现它。

#include <cstdlib>
#include <iostream>

using namespace std;

void threeint();
void FtoC();

int main()
{  
    threeint();
    FtoC();
    return 0;
}

void FtoC()

{
    double ctemp = 0, ftemp = 0;

    cout << "Please enter the temperature in Celsius which you would like to be\
            converted to Fharenheit." << endl;

    cin >> ctemp;

    ftemp = ((ctemp * (9 / 5)) + 35);

    cout << ctemp << " degrees celsius is " << ftemp << " in fahrenheit" << endl;
}


void threeint()
{
    int x = 0, bigint = 0, smlint = INT_MAX, avgint = 0, index = 0;

    cout << "Input as many integers as you like and finalise by entering any
             non-integer input" << endl;

    while (cin >> x)
    {
    if (x > bigint)
        bigint = x;
    if (x < smlint)
        smlint = x;

    ++index;
    avgint += x;
    }

cout << "The largest integer is " << bigint << ".\t" << "The smallest 
         integer is " << smlint << ".\t";

cout << "The average of all input is " << (avgint / index) << endl;
}

2 个答案:

答案 0 :(得分:0)

“错误阅读”后,cin处于错误输入状态。在重新尝试读取之前,您应该跳过错误输入并清除其标志

std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // Skip bad input

答案 1 :(得分:0)

我将首先回答你的问题。你的cin不等待输入的原因是因为cin没有被重置以在输入错误之后接受新值(比如为输入输入一个字母)。要解决此问题,您必须清除输入并忽略输入的任何错误输入。这可以通过在程序中添加以下行来完成:

 cin.clear(); // clears cin error flags
 cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // ignores any invalid input entered
  

ios :: clear为流的内部错误状态标志设置了一个新值。标志的当前值被覆盖:所有位都被状态中的位替换;如果state是goodbit(为零),则清除所有错误标志。

这是直接引自CPlusPlus.com; for cin.clear()。

  

cin.ignore()从输入序列中提取字符并丢弃它们,直到提取了n个字符,或者一个比较等于delim。如果到达文件结尾,该函数也会停止提取字符。如果过早地达到此目的(在提取n个字符或查找delim之前),该函数将设置eofbit标志。

这是直接引自CPlusPlus.com; for cin.ignore()。

这2个引号提供了2个函数如何工作的深入分析以及提供的链接。

您的计划中需要指出的其他一些事项是:

首先,当您执行9/5时,您打算将该值设为1.8。但是,由于您要划分两个整数值,编译器会将最终结果保留为na int;因此,代码中9/5 = 1。为了克服这个问题,你的除法运算的除数或除数必须是float类型。最简单和最简单的方法是执行9.0 / 5或9 / 5.0。这样,编译器就知道您希望将最终结果作为浮点值。您也可以使用强制转换,但是,添加小数点更简单,更简单。

其次,我不确定这个错误是否仅存在于您在此处发布的代码中,因为您说您的编译完美,但您的cout语句中的某些字符串文字不是由撇号正确封闭,至少在您在此处发布的代码中。例如,您的代码就是这条线:

 cout << "The largest integer is " << bigint << ".\t" << "The smallest 
     integer is " << smlint << ".\t";

上帝好运!