大风起兮90+ 发表于 2020-2-17 16:39:41

C++输入输出问题求助

#include<iostream>
int main()
{
        const unsigned short ITEM=10;
        int num;
        std::cout<<"请输入"<<ITEM<<"个整型数:"<<"\n";
        for(int i=0;i<ITEM;i++)
        {
                std::cout<<"请输入第"<<i+1<<"个数字:";
                while(!(std::cin>>num))
                {
                        std::cin.clear();   //记得clear后面要加一个括号
                        std::cin.ignore(100,'\n'); //不加这一行代码就会陷入死循环
                        std::cout<<"请输入一个合法的值:";
                }//在for中定义的变量只能在for中使用
        }
        int total=0;
        for(int j=0;j<ITEM;j++)
        {
                total=total+num;
        }
        std::cout<<"总和是:"<<total;
        std::cout<<"平均值是:"<<(float)total/10;
        return 0;
}




请问while循环里面的cin.clear()不是已经清理了缓冲区吗,为什么后面还要加一个cin.ignore呢?
我发现不加cin.igonre的话输入一个非法输入a就会陷入死循环,这是为什么呢?

superbe 发表于 2020-2-18 15:05:53

cin.clear()不是清空缓冲区,而是清除错误标志。当输入一个非法值,导致错误标志被设置,就不能继续进行后面的输入操作了。
所以要用clear清除错误标志,以便下一次输入。std::cin.ignore(100,'\n');才是清除错误的输入,意思是读取并丢弃接下来的100个字符或直到到达第一个换行符。

大风起兮90+ 发表于 2020-2-17 16:40:12

我的问题是有了第12行代码为什么还要第13行呢?

qiuyouzhi 发表于 2020-2-17 16:42:33

注释不是已经写得很清楚了吗

大风起兮90+ 发表于 2020-2-17 17:11:57

qiuyouzhi 发表于 2020-2-17 16:42
注释不是已经写得很清楚了吗

我的问题是cin.clear()不是已经清空了缓冲区了吗?为什么还需要cin.ingore来忽略换行号呢?

qiuyouzhi 发表于 2020-2-17 17:24:16

大风起兮90+ 发表于 2020-2-17 17:11
我的问题是cin.clear()不是已经清空了缓冲区了吗?为什么还需要cin.ingore来忽略换行号呢?

后边会再输入一个回车(换行符)
页: [1]
查看完整版本: C++输入输出问题求助