c++,关于c++输入输出流的问题,求解答!!

在学习小甲鱼的c++快速入门时,碰到关于数据类型数组的,用c++的方法输入10个元素存入整型数组中求总和以及平均值

#include<iostream>
using namespace std;
#define ITEM 10
int main()
{
    int num[ITEM];
    cout<<"请输入n个整数\n\n";
    for(int i=0;i<ITEM;i++){
        cout<<"请输入第"<<i+1<<"个数据:";
        while(!(cin>>num[i])){//输入错误返回0 
            cout<<"请输入正确的值:";
            cin.clear();
            cin.ignore(100,'\n'); 
        } 
    }
    int total=0;
    for(int i=0;i<ITEM;i++){
        total+=num[i];
    }
    cout<<"整数和为:"<<total<<endl;
    cout<<"平均值为:"<<total*1.0/10<<endl;
    return 0; 
     
}

在这里如果我输入错误类型字符型,得到的结果如下:

img

这是正确的,但是当我输入浮点型比如2.22时,却把2.22的整数部分输入进去,出现的错误现象如下:

img

请问我应该怎么样才可以把整个浮点数去掉达到图1一样正确的效果呢

请输入第1个数据:2.22
请输入第2个数据:请输入正确的值:2.22
请输入第3个数据:请输入正确的值:2.22
请输入第4个数据:请输入正确的值:2.22
请输入第5个数据:请输入正确的值:2.22
请输入第6个数据:请输入正确的值:2.22
请输入第7个数据:请输入正确的值:2.22
请输入第8个数据:请输入正确的值:2.22
请输入第9个数据:请输入正确的值:2.22
请输入第10个数据:请输入正确的值:2.22
整数和为:20
平均值为:2

你好,你的代码我测试了,我猜测应该是,当输入第一个2.22,他会读入小数点左面的2,然后小数点以及右面两个2还留在缓存区,按下回车表示不再输入,进入第二次循环,然后他接着上一次没读完的继续读,读到了小数点,于是提示类型错误,并且把小数点以及后面的两个2,一个回车全部清空,重新读取你第二个输入的数据,如果还输入2.22,以此类推,到了最后,缓存区里还剩小数点,22,回车。

。。。这是个坑,你如果想保证程序的健壮性,最好用字符串处理,单纯用输入流很难考虑到全部情况。

对于你这样的需求,你应该先读入一行字符串,然后进行格式检查,再转换为整型。
下面是对你的程序修改。当输入的字符串含有非数字字符,或输入数值过大都会要求重新输入。

#include <iostream>
#include <regex>
#include <sstream>

using namespace std;

bool read_int_value(int &value)
{
    static regex r("[0-9]+");
    static smatch m;
    string str;
    while (1)
    {
        if (!getline(cin, str))
            break;
        if (regex_match(str, m, r))
        {
            istringstream is(str);
            if (is >> value)
                return true;
        }
        cout << "请输入正确的值:";
    }
    return false;
}

int main()
{
    const int n = 10;
    vector<int> nums(n);
    cout << "请输入" << n << "个整数\n";
    for (int i = 0; i < n; i++)
    {
        cout << "请输入第" << i + 1 << "个数据:";
        if (!read_int_value(nums[i]))
        {
            cerr << "遇到输入流结尾\n";
            return 1;
        }
    }
    int total = 0;
    for (int i = 0; i < n; i++)
        total += nums[i];
    cout << "整数和为:" << total << endl;
    cout << "平均值为:" << static_cast<double>(total) / n << endl;
    return 0;
}

用double输入就好了,如果你想要整型,强转类型就可以了的