输入原理:
程序的输入都有一个缓冲区,即输入缓冲区。(和文件的读出是一样的,不过这里的外设是键盘)一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin对象从输入缓冲区中取数据(和文件读入时的光标位置随着每一次读前进一样)。正因为cin对象是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin对象会直接取得这些残留数据而不会请求键盘输入。也就是说我们输入的数据是先存放在缓冲区中的,之后用读入语句对缓冲区中暂存的数据进行读入。
常见的读的方式:
1.cin>> :cin使用空白(空格,制表符,换行符)来确定字符串的结束位置。这意味着cin在读入时只读取一个单词,并且读完会自动在结尾添加换行符。根据cin>>sth 中sth的变量类型读取数据,这里变量类型可以为int,float,char,char*,string等诸多类型。这一输入操作,在遇到结束符(Space、Tab、Enter)就结束,且对于结束符,并不保存到变量中。注意:最后一个enter也在缓冲区。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char a[100];
char b[100];
int main()
{
cin>>a;
cout<<"请输入b:";
cin>>b;
cout<<a<<" "<<b;
return 0;
}
以上这段程序,如果在第一次输入a时,输入“abc def”,那么运行之后会发现:命令行中弹出"请输入b:"之后,还没等我们输入b,程序就自动输出了a和b。
这一结果的原因就是:第一次输入abc def时,缓冲区中的abc被读入a,但是def还在缓冲区里,所以下一次cin会自动从缓冲区中拿走def放入b中(不用
等键盘输入)
char a[10];
char s[100];
cin>>a;
cin.getline(s,60); 这段代码里,cin.getline(s,60)不会等待用户输入,而是读走了第一行里的换行符。
但是如果连续两次使用cin,那么就不会出现这个问题,因为cin会自动跳过空白,读取有效的信息(并且这次不算一次),所以第二次cin是会等待用户输入的。
2.getline():是面向行的输入,它使用通过回车键输入的换行符来确定输入结尾。要调用这种方法,可以使用cin.getline()。该函数有两个参数,第一个参数
是用来存储输入行的数组的名称(也就是一个地址),第二个参数是要读取的字符数。如果这个参数为20,那么最多读19个,最后一个留给“ "。getline会读最后一个换行符,并且把它自动换成 ,而get()虽然也会自动加 ,但是不会读换行符。也就是说不采用特殊方法,get()永远读不过去换行符,读不到下一行。另外需要注意一点:
假设输入了40个字符,但调用getline时第二个参数给得是20,这意味着:这一次getline语句一直读到40个字符的结尾处,碰到换行符之后结束,但是只取了前20个。而并不是
把后面20个还留在缓冲区中,也就是下一次再读时,读不到东西了。
3.get():调用方法:cin.get(),两个参数和getline是一样的。为了解决get读不过换行符的问题,我们需要用到一个get的变体:cin.get()(不传入任何参数),这个
变体表示读入一个字符(即使是换行符)
所以我们常常写成:
cin.get(a,10);
cin.get();
cin.get(b,10); //读取新的一行
或者写成:
cin.get(a,10).get();
cin.get(b,10).get();
另外,getline和get都有拼接的方式。比如,cin.getline().getline();等价于用了两次cin.getline() ,还有cin.get(b,10).get();等