一.预备知识
cin对象:cin是一个 istream 类的对象,是一个标准的输入流对象,属于std空间中。
缓冲区:用来暂时存储数据的地方的。
二.“cin”与“缓冲区"
cin主要用于从标准输入(通过键盘的输入)读取数据,而标准输入的数据,先会先进入缓冲区,cin 则从缓冲区读入数据,是有先后顺序的,先输入的先读取,读取完一个上一个数据才到下一个。
三.“cin”的常见用法
- cin>>
- cin.get
- cin.getline
下面我们分别介绍几种用法及规则
四.“cin>>”
cin>> val; 与 cin.operator>>(val);等价,这是istream类的一个运算符重载,具体是怎么实现的我们不用管。这里需要注意的是,cin>>在读取缓冲区中的数据时,遇到 [回车]、[空格]、[TAB] 会视为无效数据,通过清除的方法来忽略掉它,等待有效数据的到来。
代码段:
#include <iostream>
int main()
{
int i;
char c;
std::cin>>i>>c;
std::cout<<i<<" "<<c;
return 0;
}
键盘输入: [回车][回车][回车] 10000 [空格] C [回车]
运行结果:可以看到,cin>> 并没有读取前三个 [回车] ,而是将将三个 [回车] 从缓冲区删除;输入的10000,从缓冲区赋给i,而后10000就从缓冲区删除;接着输入的空格 cin>> 也不读取,所以也是从缓冲区将他删除,并把下一个输入C赋值给c,赋值完后从缓冲区删除。
五.“cin.get”
cin.get有多个重载,但我们常见的有:
cin.get(char);等价于val=cin.get(); //这里的val为char类型
cin.get(char *,string_length);
第一种,是读取单个字符;第二种,是读取一个字符串
下面我们分别介绍它们:
1.读取单个字符:
代码段:
#include <iostream>
int main()
{
char c1,c2;
std::cin.get(c1);
std::c2=cin.get();
std::cout<<c1<<" "<<c2<<"-_-";
return 0;
}
—情况 1—
键盘输入: a [回车]
运行结果:
代码中定义了两个char变量c1,c2,接下来应该输入两个字符,在一行中显示,并还有一个 -_ - ,所以结果应该是:字符c1 字符c2-_-
但是输出的结果甚至转行输出了。因为在这里,第一个cin.get() 将读取到的字符a赋值给c1后,用户敲击 [回车] 键来转行,这是第二个cin.get() 就将[回车]存入了c2,所以就没有了玩家的第二次输入,直接到了cout语句,接下来程序也正常打印c1和c2,只是c2是转行符(\n),然后输出 -_ -
—情况 2—
键盘输入:a [空格][空格][空格][回车]
运行结果:
在这里我们将之前的 [回车] 换成了 [空格] ,在输入a以后,被正常赋给c1,但再接下来输入的三个 [空格] ,其中只有一个 [空格] 被赋给了c2,但还可以继续输入数据,这些都将存入缓冲区,之所以能继续输入的原因是, [空格] 被转换为 (\t) ,而回车被转换为 (\n)。cin对象以(\n)为结束,当读取到(\t),并不会停止继续读入数据。所以这里关于为什么能一直输入也就说得过去了。实际上还有两个 [空格] 存留在第一行的缓冲流中。 其实关于 缓冲流,又有很多需要学习的,这里不过详细讲解。(因为我也不知道…)