C++中cin读取数据原理解析

在网上看别人的博客关于cin的解读,有感而发!解决了我心头的疑惑,所以在此进行记录。

参考博客源地址:(23条消息) cin、cin.get()、cin.getline()、getline()的区别_cin.getline()函数_啊大1号的博客-CSDN博客(23条消息) C++ while(cin>>a) cin输入直到回车结束_while(cin>>)什么时候结束_子木呀的博客-CSDN博客​​​​​​

(23条消息) 在while中使用cin>>a 为条件,注意事项_c++一次性输入多组数据__ dingding_的博客-CSDN博客

欢迎大家去上面博主的文章中了解更多!

输入原理简述:

程序的输入都建有一个缓冲区,即输入缓冲区。每次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据(cin读取数据是从第一个非空白字符开始到下一个空白字符结束)。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入

比如下面的例子:

void test_input()  
{  
    string str;  
    cout<<"cin的测试:"<<endl;  
    cin>>str;  
    cout<<str<<endl;  
    cin>>str;  
    cout<<str<<endl;  
}  

 

由于cin在遇到空格/tab时,就会停止读取,所以如果我在第一次输入时,利用空格隔开两个字符串,那么cin在第一次取的时候,只会读取前一个字符串,到空格结束,此时缓冲区还保留着前面输入的第二个字符串,那么第二次cin就会直接从缓冲区取残留数据,而不会请求输入

然后来说一下 C++ while(cin>>a) 问题

cin>>a是有返回值的,只要a满足类型条件,就会return true,一直执行下去,而cin会忽略空格或者enter,因此,enter后不会结束循环。只能ctrl+Z。

其实很简单:通过get()判断下一个输入是不是回车就行。

while(cin>>a){
    ...
    if(cin.get()=='\n') break;
} 

接下来我们来看一个例子:

#include<iostream>
using namespace std;
int main()
{
	int currVal = 0 , val = 0;
	if(cin >> currVal)
	{
		int cnt=1;//统计次数
		while(cin >> val)
		{
			if(currVal == val)
			{
				cnt++;
			}
			else{
				cout << currVal <<" occurs "<<cnt<<" times "<<endl;
				currVal = val;
				cnt=1;//重新计算另一个 
			}
		} //while循环结束 
		cout << currVal <<" occurs "<<cnt<<" times "<<endl;//打印最后一个数 
	}//if循环结束 
	return 0;
}

测试用例输入1 2 3 4,会发现最后一个4的个数无法统计

这是因为现在程序还卡在while(cin>>val)中,可以选择ctrl+z结束,看下图:​​​​​​​

 

或者增加一行代码:if(cin.get()=='\n') break;

#include<iostream>
using namespace std;
int main()
{
	int currVal = 0 , val = 0;
	if(cin >> currVal)
	{
		int cnt=1;//统计次数
		while(cin >> val)
		{
			if(currVal == val)
			{
				cnt++;
			}
			else{
				cout << currVal <<" occurs "<<cnt<<" times "<<endl;
				currVal = val;
				cnt=1;//重新计算另一个 
			}
            if(cin.get()=='\n') break;
		} //while循环结束 
		cout << currVal <<" occurs "<<cnt<<" times "<<endl;//打印最后一个数 
	}//if循环结束 
	return 0;
}

当用例中‘4’被读入val后,cin.get()会得到‘4’后面的‘\n’回车符号,实现while(cin>>a)终止。

以上是我学习过程中的随记,所以写的知识点有点乱,还请各位看官老爷多多包涵!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值