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 <iostream>
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加回车:


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

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


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

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

再输入ctrl+D:


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

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


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


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

  • 38
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
cin作为while条件是一种常见的用法,主要用于循环读取用户输入。cinC++中用于输入流的对象,可以用来读取键盘或其他输入设备上的数据。 当我们将cin作为while循环条件时,循环将会一直执行,直到满足某个终止条件。通常我们会在循环内部对cin进行处理,例如读取用户输入的数据并进行相应的操作。 使用cin作为while条件有以下几个优点: 1. 实时读取:cin可以实时地读取用户输入的数据,保证了用户输入的数据是及时有效的。 2. 循环控制:我们可以根据读取到的数据类型来决定循环是否继续执行。例如,当读取到不合法的数据时,我们可以提示用户重新输入或结束循环。 3. 灵活性:cin可以用于不同类型的数据读取,比如整数、浮点数、字符串等。这样我们可以根据具体需求对输入进行不同的处理。 使用cin作为while条件时,需要注意以下几点: 1. 输入错误处理:要考虑到用户可能输入错误的情况,我们应该在循环内部使用条件语句对输入进行验证,以防止程序出错或陷入死循环。 2. 输入结束条件:我们需要定义一个适当的终止条件,以便在满足条件时结束循环。例如,当用户输入某个特定的值或空值时,循环可以结束。 总而言之,cin作为while条件是一种方便且常用的方式,可以帮助我们实现循环读取用户输入并进行相应的处理。同时,需要注意错误处理和终止条件的设定,以保证程序的正确执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值