c++ cin 作为while条件

本文一切测试在windows clion中进行

在clion中,ctrl +z并不是文件结束符
在cmd中运行,只需要ctrl+z再加回车就可以得到正确结果

1.cin

       cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream 类的对象。这里的标准输出指的是终端键盘,标准错误输出指的是终端的屏幕。

       在理解cin功能时,不得不提标准输入缓冲区。当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键(\r)会被转换为一个换行符\n,这个换行符\n也会被存储在cin的缓冲区中并且被当成一个字符来计算!比如我们在键盘上敲下了123456这个字符串,然后敲一下回车键(\r)将这个字符串送入了缓冲区中,那么此时缓冲区中的字节个数是7 ,而不是6。

       cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发cin的成员函数去读取数据。当cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理。 

       使用一个istream的对象作为条件时,效果是检查流的状态。若流有效,则检测成功,返回true。当遇到文件结束符或者无效的输入(比如用一个字符来作为一个整型数的输入时),istream的对象状态会变为无效。

总而言之:

(1)  输入数据时需要敲回车键才能将数据送到缓存器,cin才能读取缓存区的数据。

(2) 当cin遇到文件结束符(windows中为:ctrl +Z , Unix 中为:ctrl +D),或无效输入才能使cin状态无效。

一下这段测试代码将说明以上问题。

代码作用: 统计输入值中数据连续出现的次数。

因为无法判断输入数据的个数,所以无法采用一个定值来控制循环次数。这里我们使用cin来作为if 条件:

#include 
using std::cin;
using std::cout;
using std::endl;
int main() {

    cout << "Enter a list of integers:" << std::endl;
    int currVal = 0;
    int val = 0;
    int cnt = 0;

    /*读入第一个输入的数据*/
    if ( cin >> currVal ){
        cnt = 1;
        /*循环读入之后的数据*/
        while( cin >> val ){
            /*如果当前读入的数据val与之前的数据currVal相等,cnt++*/
            if (currVal == val) {
                ++cnt;
            } else {
                /*如果不相等,输出之前数据currVal连续出现的次数,同时重新统计当前数据的连续出现次数*/
                cout << currVal << " occurs " << cnt << " times. " << endl;
                currVal = val;
                cnt = 1;
            }
        }
          /*打印最后一个数据的连续出现次数*/
        cout << currVal << " occurs " << cnt << " times. " << endl;
    }
    return 0;
}


(1)控制台输入 1 2 3 4 5 6 7加回车:

c++ cin 作为while条件_第1张图片

7的统计并没有显示,因为这个时候我们只是将数据push到了缓冲区,while中的cin读取到7,流的检测状态是true,所以并没有退出循环,还在等待下一个输入数据,不能执行while循环之外的代码,因此不能打印最后下一个数据7。

(2)控制台输入 1 2 3 4 5 6 7加ctrl+D:

c++ cin 作为while条件_第2张图片

直接以ctrl+d结束数据,数据1到7没有提交到缓冲区,而if中的cin直接读取到文件结束符,流状态检测为false,if中的代码不能执行,直接结束程序运行。

(3)控制台输入1 2 3 4 5 6 7加回车:

再输入ctrl+D:

c++ cin 作为while条件_第3张图片

 1到6的输出如(2)中所述,等我们再次输入文件结束符号时,cin流状态为false,结束while循环,因此执行while循环之外的代码,打印出最后一个数据7 的统计次数。

(4)控制台输入1 2 3 4 5 6 7 t 加回车: 

c++ cin 作为while条件_第4张图片

我们输入1到7和t之后,再enter,将数据push到缓冲区。在while循环的条件中,cin逐个读入到val中,再执行循环体中的代码,最后读到t时,企图将字符存入到int型的变量中,无效输入导致流状态为false,种植while循环,可以打印出最后一个数据的统计信息。


关于c++中的标准输入流对象的应用可以参考一下这篇博文:
http://blog.csdn.net/k346k346/article/details/48213811

你可能感兴趣的:(c++ cin 作为while条件)