[C++ Primer Plus] 第7章、函数——(一)程序清单

程序清单7.7中的一部分

转自https://blog.csdn.net/lancert9/article/details/43410811

使用 if(!cin) 对输入的参数进行相应数据类型的判断,对于初学者来说具有很大的引用力。但是,在使用 if(!cin) 做出判断时,可能会遇到一些奇特的问题,这里以笔记的形式对其中的几类简单情况做出总结。

首先,列写出正确地应用方式:

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int temp;
 7     while (1)
 8     {
 9         cout << "Enter it: " << endl;
10         cin >> temp;
11         if (!cin)
12         {
13             cout << "BAD" << endl;
14             cin.clear();
15             while (cin.get() != '\n')
16             continue;
17 
18         }
19         else
20             cout << "GOOD" << endl;
21 
22     }
23     system("pause");
24     return 0;
25 }

 该程序十分简单,用来判断输入的值是否为 int 类型。下面是一些测试数据的返回结果,其能够说明一些问题:

1.输入的值为12,其为理想输入,打印 “GOOD”;

2.输入的值为12.3,不满足 int 类型。但为什么能够首先打印出 “GOOD” 呢?这是因为操作符 “>>” 逐个抽 取输入流中的数据,不断与 int 类型匹配,哪怕只是部分匹配,cin 对象的标记位都不会被改变,可以正常的输入。对于此例,也就是 “12.3” 中的 “12” 可以先被抽出进入循环,打印出 “GOOD”。一旦输入完全不匹配,操作符 “>>” 无法进行任何抽取,返回的cin 对象的fail 标记位置1,good 标记位置0。这种状态在 cin.clear( ) 生效之前(标记位重置),会使输入流不能再进行继续的输入。而这种性质也就导致了本例中对于 “12.3” 的输入,在打印完 “GOOD” 之后并没有经历再次输入的过程就马上打印 “BAD”。而触发这种状况的是字符 ‘.’ 进入判断条件,而无论后面接 ‘3’ 还是 ‘a’ 都对结果没有任何影响。因为它们已经被接下来的代码段给清空了,而这也就是下面要说明的问题。

3.有没有接下来的代码段影响很大:

 我们先看看注释掉它的效果:

一旦输入不符合要求的值,它将无限打印 “BAD”。那么问题出现在哪呢?以输入“12.2”为例,如果没有上述代码清空输入缓存中的 “坏数据”,那么对于字符 “.” ,就处在了一个十分尴尬的位置。虽然在它引发了第一次错误后重置了标记位,但这并不会使它具有通过语句 “cin >> temp” 而进入一个int 类型的变量当中的特权。当然,这也是 cin 所必须具备的特质,否则其便没法称职的保护输入流。所以,这种局面就会被描绘成这样:字符 “.” 永远出现在输入缓存区的最前端被不断地拿来调用,使程序不断地打印 “BAD”,但其本身却永远无法跨过cin 这座关卡。
————————————————
版权声明:本文为CSDN博主「Lancert9」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lancert9/article/details/43410811

猜你喜欢

转载自www.cnblogs.com/Fionaaa/p/12327807.html
今日推荐