本篇部分引用自https://blog.youkuaiyun.com/k346k346/article/details/48213811
一、简介
cin 是 C++ 的标准输入流对象,即 istream 类的对象。cin 主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。
在理解 cin 功能时,不得不提标准输入缓冲区。当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键会被转换为一个换行符(\n),这个换行符也会被存储在 cin 的缓冲区中并且被当成一个字符来计算!比如我们在键盘上敲下了 123456 这个字符串,然后敲一下回车键将这个字符串送入了缓冲区中,那么此时缓冲区中的字节个数是 7 ,而不是 6。
cin 读取数据也是从缓冲区中获取数据,缓冲区为空时,cin 的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发 cin 的成员函数去读取数据。
要注意的是,当缓冲区有数据时,就不用从键盘输入了,而是直接读取缓冲区已有的数据。
二、cin常用的方法
1、cin>>
cin 可以连续从键盘读取想要的数据,以空格、tab 或换行作为分隔符。
来看几个例子:
例1:
#include<iostream>
using namespace std;
int main()
{
char a[100];
char b[100];
cin >> a;
cout << a;
}
操作如下:在终端输入“hello world”按下回车键。
这个例子很好的说明了,cin遇到空格结束。
例2:
#include<iostream>
using namespace std;
int main()
{
char a[100];
char b[100];
cin >> a;
cin >> b;
cout << a << endl;
cout << b << endl;
}
操作如下:在终端输入“hello world”按下回车键。(注意本例只从键盘输入了一次)
因为,执行到cin>>b这句时,缓冲区中有数据“world”,因此不用再次键盘输入,直接将缓冲区的数据写给b。
2、cin.get()
get函数常用的原型有以下几种:
istream& get( char& var );
istream& get( char* s, streamsize n );
istream& get( char* s, streamsize n, char delim);
分别来谈
2.1读取一个字符
#include<iostream>
using namespace std;
int main()
{
char a;
char b;
a = cin.get();
b = cin.get();
cout << a << b << endl;
}
操作如下:输入“G”。回车。直接输出单个“G”
为什么b=cin.get()这句没有从键盘输入呢?
原因在于:cin.get()和cin>>不同,不跳过缓冲区中的分隔符,因此本例中b实际上是个换行符。
2.2读取一行
默认以换行符结束。对于第三种函数原型,则指定了某特殊字符作为结束标志。n表示可接受的字符串的长度。
整几个例子:
例1:
#include<iostream>
using namespace std;
int main()
{
char a[100];
char b[100];
cin.get(a, 5);
cout << a;
}
这个例子展示了通过n来限制字符串。
例2:
#include<iostream>
using namespace std;
int main()
{
char a[100];
char b[100];
cin.get(a, 20,'#');
cout << a;
}
此时我在输入过程中遇到换行符并不终止,而是遇到了“#”才结束。
例3:
#include<iostream>
using namespace std;
int main()
{
char a[100];
char b[100];
cin.get(a, 5);
cin.get(b, 5);
cout << a << endl;
cout << b << endl;
}
此时会出现和2.1类似的问题。原因在于get并不忽略分隔符。
为了解决它只需要将第7行改为:
cin.get(a, 5).get();
此时的换行符被get()获取,b数组可以正常接受缓冲区中的数据。
3、cin.getline()
getline()和get()用法类似,但它并不会将结束符(例如:换行符)残留在缓冲区中。