一 cin输入缓冲区
从标准输入(键盘)写入的数据会都存放在输入缓存区,当输入缓存区有数据时,cin会直接从输入缓存区读取,而当输入缓冲区没有数据时,cin会挂起请求用户输入数据;
二 cin的使用
(1)cin >> x;
从标准输入写入数据,按enter键结束此次输入,而cin >> x;读取一次数据结束的标志是空白(包括空格,制表符tab,回车)
表达式cin >> x;
(2)while(cin >> x)的使用
cin 是istream类的一个对象,表达式cin >> x的返回值;
- cin >> x; 当cin读取的数据类型与预期的数据(x的数据类型)相同时,表达式cin >> x的返回值是cin对象,x的值为cin赋的值;
- 当cin读取的数据类型与预期的数据不同时,表达式cin >> x的返回值是false,x的值为0(无论x的初始值是什么);
int i = 2;
cin >> i;
cout << i;
//输入w,与期望值i的类型int不同,表达式cin >> i返回false,x 的值变为0
//输出0
综上,while(cin >> x)当输入的数据类型与x的类型相同时,会一直执行循环,当输入的类型与预期类型不用时结束循环;
一般用于给整形数组或浮点型数组赋值,整形数组和浮点型数组不可对数组整体赋值,字符数组可整体对数组赋值,如
int array[10];
cin >> array; //会报错
//输入 5 6 2 1 3 7 8 9
char str[10];
cin >> str;
cout << str;
//输入 dsfds
//输出 dsfds
使用while(cin >> array[idx++])给整形或浮点型数组赋值
int array1[10];
double array2[10];
int idx = 0; //数组下标索引
while(cin >> array1[idx++])
//会从数组下标0开始给数组赋值,当标准输入类型与数组类型不同时,结束循环
(3)cin >> x >> y;
理解cin>>x;的返回值特性后也就好理解给多个变量赋值cin >> x >> y;的原理了,cin >> x赋值成功返回cin对象,再执行cin >> y;对y赋值,cin >> x 赋值失败时,x的值变为0,y的值不变;
三 cin.get()
(1)cin.get()读取一个字符;
有两种读取方式
char c1;
c1 = cin.get()
cin.get(ci)
cin.get()会从输入缓冲区读取一个字符(即使是换行符也能读取),
(2)cin.get(array,size)和cin.getline(arrray,size)读取一行
cin.get(array,size)和cin.getline(array,size)都用来读取一行数据,通过回车键来确定结尾,参数包括存储输入行数组名称,和读取长度size,如果size=20,则最多读取19个字符,最后一位用于存储空字符;
区别:
①对输入缓冲区换行符的处理
- cin.getline(array.size)通过换行符确定行尾,然后丢弃输入缓冲区的换行符,
- cin.get(array,size)同样使用换行符确定行尾,但不会丢弃输入缓冲区的换行符,
为什么有时使用cin.get(array,size)读取一行而不是使用cin.getline(array,size)呢?
使用cin.get(array,size)读取一行后,再使用cin.get()读取查看下一字符是不是换行符即可知道停止读取的原因,是因为已经读取了整行或者是由于数组已经被填满呢;
②对空行和输入溢出时的处理
- 当输入是空行时,cin.get()会设置失效位(failbit),接下来输入会被阻断,可使用cin.clear()来恢复
- 当输入溢出时,即输入行的字符数比指定的多,getline()和get()都会把余下的字符留在输入缓冲区中,而getline()会设置失效位,并关闭后面的输入;