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 回車

 

那么,當有如下這段代碼

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM