C++中cin>>a原理

int a;

vector<int>res;

while(cin>>a){

  res.push_back(a);

}

给出这段代码

可以输入1 2 3 4 5并以回车结束,从而分5次存入res。

也可以输入 1 2回车3 4 5回车 当然可以这么一直输入,直到输入一个任意字符结束

无while仅仅为cin>>a时,若输入1 2 3 回车 ,此时仅仅存入第一个1。

有个问题:a只是一个变量,不能同时放入5个数据,那么这个数据流到底存在哪,又是怎么依次存入res中的?

猜测为缓冲区有一块专门的地方放这些数据流

查阅:http://c.biancheng.net/view/1325.html后了解:

当用户从键盘输入字符时,它们暂时放置在称为输入缓冲区或键盘缓冲区的内存区域中。当 cin 读取它们时,会自动将它们转换为要存储输入数据的变量的数据类型。

用户在输入数字时要用空格分隔数字。这样 cin 才能知道每个数字的开始和结束位置。

假如定义:

int whole;

float fractional;

int letter;

当:输入5.7 4 b 回车

C++中cin>>a原理

那么,当有如下这段代码

int a, b;
vector<vector<int> >res;
for (int i = 0; i < 2; ++i) {
    vector<int>tmp;
    while (cin >> a) {
        tmp.push_back(a);
    }
    res.push_back(tmp);
}

输入1 2 3 4 s(s赋值给a会将其置为0)后res内只会有一个结果,for循环的第二次及以后while会被自动跳过,原因是a在缓冲区没有擦除,cin>>a后的返回值为0??

这时调用什么??? 能正常二次输入? setwind,fflush,clear,在vs2017内都没用。暂时还没找到办法

当有如下这段代码

vector<int>res;
for (int i = 0; i < 2; ++i) {
  cin >> a;
   res.push_back(a);}

输入:1 2 3 4

结果:res内为1 2

分析:cin>>a向缓冲区写入了1 2 3 4但每次a都是取一个放入res,由于for只设置了2个所以最后res内只有前两个1 2

当有如下这段代码

char a;
int b,c;
for(int i=0;i<2;++i){
    cin>>a>>b>>c;
    fun(a,b,c);  
}

输入:t 1 2 回车r 2 3

这段代码可以动态实现fun函数的功能即 :通过for循环先处理fun(t,1,2)再处理fun(r,2,3) 这在线性处理多组数据时非常有用

有点乱,找时间重新理一下,第二段代码还有问题待解决,有时间再弄

Reference:http://c.biancheng.net/view/1325.html
原文链接: https://www.cnblogs.com/hqdong123/p/12904795.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/197467

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午7:34
下一篇 2023年2月12日 下午7:34

相关推荐