C++中的输入及其原理简析

输入原理:

程序的输入都有一个缓冲区,即输入缓冲区。(和文件的读出是一样的,不过这里的外设是键盘)一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而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();等

这篇文章,是又一个故事的结束...
lazy's story is continuing.
原文地址:https://www.cnblogs.com/Hello-world-hello-lazy/p/13591979.html