c++中cin缓冲区

输入过程:

程序输入的时候都设有一个输入缓冲区,每次输入,当键盘输入结束时会将输入的数据存入输入缓冲区,而cin直接从输入缓冲区中取数据。正因为cin是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin会直接取得这些残留数据而不会请求键盘输入。

一、cin

#include <iostream>
using namespace std;
int main()
{
	string s;
    cout<<"cin test:"<<endl;
    cin>>s;
    cout<<s<<endl;
    cin>>s;
    cout<<s<<endl;
    
    return 0;
}
运行情况:
一、
输入abc[空格]def,
输出:
   abc
   def
   
cin test:
abc def
abc
def

二、
输入abc[Tab]def
输出:
	abc
	def

cin test:
abc     def
abc
def

cin在遇到空格、回车、以及tab键都会结束读取,此时若输出缓冲区还有数据,则下一个cin会直接取走输入,而不会请求键盘输入,对于回车,最后的enter也会保存在缓冲区。

对于这种情况,可以用cin.sync();来清空缓冲区,加上之后:

#include <iostream>
using namespace std;
int main()
{
	string s;
    cout<<"cin test:"<<endl;
    cin>>s;
    cout<<s<<endl;
    cin.sync();  
    cin>>s;
    cout<<s<<endl;
    
    return 0;
}
输入:abc[空格]def,
输出:abc
输入:def
输出:def  

cin test:
abc def
abc
def
def

二、cin.get()

输入结束的条件:Enter键,但不丢弃Enter

cin.get()有三种格式:

  1. 无参:cin.get();
  2. 一个参数:cin.get(char s);或者ch=cin.get(); 两者等价
  3. 两个参数:cin.get(数组名,数组长度);

看一个例子:

#include<iostream>
using namespace std;
int main()
{
       char c1, c2;
       cin.get(c1);
       cin.get(c2);
       cout<<c1<<""<<c2<<endl;  
       cout<<(int)c1<<" "<<(int)c2<<endl;
       return 0;
}

打印两个字符,并输出他们的ascll码

测试一:
输入:ab
输出:ab
	 97 98

测试二:
输入:a b
输出:a 
	 97 32
此测试说明cin.get()将空格读入

测试三:
输入:a[回车]
输出:a
	 [回车]
	 97 10
此测试说明cin.get()将回车读入

cin.get()可以用于对于一个输入按回车结束的情况,例如:

while(cin>>a)
{	
		if(cin.get()=='\n')//cin.get清除输入不是整形的内容,但他不会忽略空格和换行。 
			break;
}

看一下接收数组的情况:

#include<iostream>
using namespace std;
int main()
{
    char a[20];
    cin.get(a,5);
    cout<<a<<endl;
    
	return 0;
}
测试一
输入:abcdef
输出:abcd

输入超出长度,只输出abcd

测试二
输入:ab[空格]c
输出:ab[空格]c

输入时遇到Enter结束输入,可接受空格,Tab键
#include<iostream>
using namespace std;
int main()
{
    char ch='a',a[20];
    cin.get(a,5);
    cin.get(ch);
    cout<<a<<endl;
    cout<<ch<<endl;
	cout<<(int)ch<<endl;
	return 0;
}
输入:12[空格]3[回车]
输出:12[空格]3
	 10
	 
遇到换行符时结束读取,但是不对换行符进行处理,换行符仍然残留在输入缓冲区。

三、cin.getline()

cin.getline()与 cin.get(数组名,长度)的读取方式类似,以Enter结束,可以接受空格。按照长度读取字符, 会丢弃最后的Enter(cin.get()不会丢弃),两者都会在读取的字符串后面自动加上’\0’

这两个函数的区别在于:

  • cin.get(数组名, 长度),当输入的字符串超长时,不会引起cin的错误,后面的cin操作会继续执行,只是直接从缓冲区中取数据。
    cin.get读取一行时,遇到换行符(自定义结束符)时结束读取,但是不对换行符(自定义结束符)进行处理,换行符(自定义结束符)仍然保留在输入缓冲区。
  • cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。之后如果用ch=cin.get()是读取不到留在缓冲区中的数据的。
    getline读取一行字符时,默认遇到’\n’(自定义结束符)时终止,并且将’\n’(自定义结束符)直接从输入缓冲区中删除掉,不会影响下面的输入处理。

看段代码测试:

#include <iostream>
using namespace std;
int main()
{
    char ch, a[20];
    cin.getline(a,5);
    cin>>ch;
    cout<<a<<endl;
    cout<<(int)ch<<endl;
    return 0;
}
测试一:
输入:abcde
输出:abcd
	 0
	 
测试二:
输入:ab[空格]c
	 a
输出:ab[空格]c
	 97

四、getchar()

这是c语言中的函数,用来从缓冲区取走一个字符,一般都是用来取走回车

#include<iostream>
using namespace std;
int main()
{
       char c1, c2;
       cin.get(c1);
       getchar();
       cin.get(c2);
       cout<<c1<<" "<<c2<<endl;  
       cout<<(int)c1<<" "<<(int)c2<<endl;
       return 0;
}
测试一
输入:ab[回车]
输出:a
	 [回车]
	 97 10
这里是接收完a后,getchar()将b取走,此时按下回车,然后继续接收一个回车

测试二
输入:a[回车]
	 b
输出:a b
	 97 98
输入a取走后按下的回车被getchar()取走,然后继续输入b取走b

测试三
输入:a[空格][回车]
输出:a
	 [回车]
	 97 10
输入a后,a被接收,然后空格被getchar()取走,最后的回车又被接收


  • 11
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值