输入过程:
程序输入的时候都设有一个输入缓冲区,每次输入,当键盘输入结束时会将输入的数据存入输入缓冲区,而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()有三种格式:
- 无参:cin.get();
- 一个参数:cin.get(char s);或者ch=cin.get(); 两者等价
- 两个参数: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()取走,最后的回车又被接收