输入原理:
程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入.
一、cin>>
- 读取时结束条件:enter, space, tab
- 对结束符的处理:不读取enter,space, tab,不丢弃缓冲区中的Enter
#include <iostream>
using namespace std;
int main()
{
char name[2];
cin>>name;
cout<<name<<endl;
}
注意:当输入字符过长时,正常输出,不会受到数组长度限制。原因:C++不做边界检查,即使超限了,也不会管,但会影响到缓存区的其他数据。
二、cin.get()
2.1cin.get读取一个字符
读取一个字符,可以使用cin.get(有参数)=cin.get(void)
- 输入结束条件:换行符
- 对结束符处理:不读取enter,不丢弃缓冲区中的Enter
示例代码如下:
#include <iostream>
using namespace std;
int main()
{
char a;
char b;
cin.get(a).get();
b=cin.get();
cout<<a<<b<<endl;
return 0;
}
问题: 连续两次调用get():由于第一次调用后,换行符留在缓存中,第二次调用时便会调用第一次调用的换行符,此时,第二个get()认为以及到达行尾。
解决方案4种
1 cin.get(name, Arsize);
cin.get();
cin.get(dessert, Arsize);
2. 或者是cin.get(name, Arsize).get();
3.使用cin.sync()函数
4.使用cin.ignore()函数
#include <iostream>
using namespace std;
int main()
{
char a;
char b;
cin.get(a);
cin.sync();
b=cin.get();
cout<<a<<b<<endl;
return 0;
}
int main()
{
char a;
char b;
cin.get(a).get();
b=cin.get();
cout<<a<<b<<endl;
return 0;
}
int main()
{
char a;
char b;
cin.get(a);
cin.get();
b=cin.get();
cout<<a<<b<<endl;
return 0;
}
int main()
{
char a;
char b;
cin.get(a);
cin.ignore();
b=cin.get();
cout<<a<<b<<endl;
return 0;
}
2.2cin.get读取一行字符
cin.get(数组名,长度,终止字符(可以指定特定字符)(可以省略))
- 输入结束条件:指定特定字符为终止符(省略时回车为终止符)
- 对结束符处理:不读取enter,不丢弃缓冲区中的Enter,结尾添加空字符,输出长度-1。
#include <iostream>
using namespace std;
main ()
{
char a[20];
cin.get(a,20);
cout<<a<<endl;
输入:jkl jkl jkl
输出:jkl jkl jkl
输入:abcdeabcdeabcdeabcdeabcde (输入25个字符)
输出:abcdeabcdeabcdeabcd (接收19个字符+1个'\0')
三、cin.getline()
cin.getline(数组名(不可以是字符串),长度,终止字符(可以省略))
- 输入结束条件:换行符
- 对结束符处理:丢弃缓冲区中的Enter,并用空字符代替,输出长度减-1
#include <iostream>
using namespace std;
main ()
{
char a[3];
cin.getline(a,3);
cout<<a<<endl;
}
输入123
输出12
四.getline()
用于接收一个字符串,可以接收空格并输出,需包含#include <string>
常见的getline()函数语法有两条:
1) istream& getline ( istream &is , string &str , char delim );
2) istream& getline ( istream &is , string &str );
delim 终结符,遇到该字符停止读取操作,不写的话默认为回车。
如:第一种为可以定义的间隔符,第二种为回车结束.
注意:
1、当getline与whlie一起使用的时候,即while(getline(cin,str))是一个死循环,只有当按Ctrl+z或键入EOF才会结束。
2、当使用getline的时候,如果前面用cin输入东西,则必须输入cin.get()吃掉回车符.
#include<iostream>
#include<string>
using namespace std;
int main ()
{
string str;
getline(cin,str);
cout<<str<<endl;
return 0;
}
输入:jkljkljkl
输出:jkljkljkl
输入:jkl jfksldfj jklsjfl
输出:jkl jfksldfj jklsjfl
五、cin清空输入缓冲区
- 程序中使用cin.ignore清空了输入缓冲区的当前行,使上次的输入残留下的数据没有影响到下一次的输入,这就是ignore()函数的主要作用。
- cin.ignore(int intExp, char chExp);
其中intExp 是一个整型表达式,也可以是一个整型数值,这个数值表示在一行中忽略的字符的最大数目,比如说intExp=100;还有一个参数chExp,是一个字符表达式。表示如果遇到一个字符值等于chEXP,那么就停止ignore(),如果ignore100个字符之后还没遇到值等于chEXP的字符,那也得停止ignore(),所以100是ignore()所忽略的最大字符数。
- 或者使用:cin.ignore(numeric_limits< std::streamsize>::max());我在使用code::blocks时报错,不知道其他编译器的使用情况。
其中,numeric_limits::max()不过是头文件定义的流使用的最大值,你也可以用一个足够大的整数代替它。
- 如果cin.ignore()不给参数,则默认参数为cin.ignore(1,EOF),即把EOF前的1个字符清掉。
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
int ival1 = 0, ival2 = 0,ival3=0;
cin >> ival1;
cin.ignore(100, '\n');
cin >> ival2;
cin.ignore();
cin>>ival3;
cout << "ival1 = " << ival1 << endl;
cout << "ival2 = " << ival2 << endl;
cout << "ival3 = " << ival2 << endl;
return 0;
}
输入:
12 34 56
78 90
输出:
ival1 = 12
ival2 = 78
ival3 = 78
2、cin.sync();
2.C++之cin(三)——关于cin.sync_Elegie_的博客-CSDN博客_c++ cin.sync
3、cin.clear();参考下面的文档,我自己还是不能够理解,但是他总是和cin.clear()结合在一起使用
C++中cin.clear()的用法 - 蝴蝶狼 - 博客园
总结:
- cin.ingore()和cin.clear()是一起使用的。
- 一般不要使用cin.sync(),他的作用并不是删除数据流。
结尾
总结:
- cin读取词,getline 和get读取行
- 区分需要输入的是数组还是字符串,getline()中需要输入的是字符串。
- cin.getline与cin.get的区别是,cin.getline不会将结束符或者换行符残留在输入缓冲区中。
- getline()和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数。